使用$ push和$ not进行MongoDB upsert

时间:2012-09-12 15:12:19

标签: mongodb

我最近更新到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") } ] }

有什么想法吗?

修改 我忘了提到,这是因为以下工作正常而在此版本中添加了$ not,因此不存在数组/字段不存在的问题。

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

2 个答案:

答案 0 :(得分:3)

$elemMatch的行为在2.2中略有变化,这就是为什么它不再与$not结合使用,> 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") } ] } 只是meta-operator否定其他运算符而实际上无法实现用于搜索字段。

相反,您可以使用$nin(不在)来检查会话数组中的值。

例如,

{{1}}

答案 1 :(得分:2)

我提交了一个错误“a query field with a $not operator should not be used to populate an upsert document”,它将被反向移植到2.2.x中,以解决这种情况。