2012-09-12 45 views
2

我最近更新到Mongodb 2.2.0,發現下面的查詢現在不再起作用。

數據庫是空的,我運行以下命令:

db.Sessions.update({_id:"test",sessions:{$not:{$elemMatch:{type:"Web"}}}},{$push:{sessions:{type:"Web",dateAdded:new Date}}},true) 

返回錯誤:

Cannot apply $push/$pushAll modifier to non-array 

更新前,下列文件將被創建:

{ "_id" : "test", "sessions" : [ { "type" : "Web", "dateAdded" : ISODate("2012-09-12T15:11:11.942Z") } ] } 

有什麼建議嗎?

編輯: 我忘了說,這是另外的$不是在這個版本的假期,因爲下面的正常工作,所以它不是該數組/場不存在的問題。

db.Sessions.update({_id:"test"},{$push:{sessions:{type:"Web",dateAdded:new Date}}},true) 

回答

3

$elemMatch行爲在2.2微微一變,這就是爲什麼不再結合工作與$not,這是唯一的否定其他運營商meta-operator而實際上不能用於搜索領域。您可以使用$nin(不在)來檢查會話數組內的值。

例如,

> db.Sessions.update({ _id:"test", sessions: { "$nin": {type: "Web"} } }, {"$push":{sessions:{type:"Web",dateAdded:new Date}}},true); 
> db.Sessions.findOne(); 
{ 
    "_id" : "test", 
    "sessions" : [ 
     { 
      "type" : "Web", 
      "dateAdded" : ISODate("2012-09-12T16:03:18.271Z") 
     } 
    ] 
} 
+0

完美,謝謝。 – DwayneBull

+0

這不起作用。當再次調用更新時,它將最終再次推送該對象,因爲$ nin實際上沒有做任何事情。 $ nin不用於檢查數組中的值。 –