我最近更新到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)
答案 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中,以解决这种情况。