2012-09-06 10 views
1

對於mongodb 2.0.6,相同的查詢正常工作。將其更新至2.2.0後會出現錯誤並且未執行該操作。

"errmsg" : "exception: can't append to array using string field name [$]" 

這發生在下面一行:

db.findAndModify(query, null, null, false, updateJob, true, false); 

其中查詢是:

{ "_id" : ObjectID , "job" : { "$elemMatch" : { "jobId" : "1"}}} 

updateJob是:

{ "$set" : { "job.**$**.endTime" : { "$date" : "2012-09-05T04:12:44.708Z"}} 

** 我的測試COLLEC重刑如下,我想更新我的第一份工作,並設置新的結束時間。

{ 
    "_id" : "5f6761d1-589a-4140-9753-5e890ab3ecb9", 

    "name" : "Test", 

    "lastJobId" : 2, 

    "job" : [{ 
     "jobId" : "1", 

     "jobName" : "test1", 

     "endTime" : ISODate("2012-09-07T17:39:43.032Z"), 

    }, { 
     "jobId" : "2", 

     "jobName" : "test2", 

     "endTime" : ISODate("2012-09-07T17:39:43.838Z"),  
    }] 
} 

和查詢用於此是:

{ findandmodify : "Test", query : { _id : "5f6761d1-589a-4140-9753-5e890ab3ecb9", job : { $elemMatch : { jobId : "1" } } }, update : { $set : { job.$.endTime : new Date(1347039583032) } , new : true } 
+0

它是否可以用作更新? –

+1

如果您剪切並粘貼實際命令和所有定義 - 這在shell中不是合法語法,那麼我們的答案可能對您的實際問題不正確。 –

+0

感謝您的幫助。我還沒有嘗試過更新。但更新的另一個查詢正常工作。以shell格式查詢{findandmodify:「Test」,query:{_id:「6bfe653c-10b2-49c2-b4e7-c26350d886dd」,job:{$ elemMatch:{jobId:「1」}}},update:{$ set: {job。$。endTime:new Date(1346914611104)},new:true} – user1535750

回答

0

您的疑問:

{ "_id" : ObjectID , "job" : { "$elemMatch" : { "jobId" : "1"}}} 

不需要用 「$ elemMatch」 的。 $ elemMatch特別適用於您試圖匹配數組元素內的多個字段的情況。

既然你只有一個,你可以消除$ elemMatch,只需使用{「job.jobId」:「1」}作爲查詢過濾器和「_id」,然後你的findAndModify就可以正常工作。

有一個錯誤,它會阻止findAndModify的$ elemMatch和位置操作符更新在2.2中提交,它被提交here