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") } ] }

有任何想法吗?

编辑: 我忘了提,在这个版本中添加了 $not ,因为以下工作正常,所以数组/字段不存在不是问题。

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

2 回答 2

3

的行为$elemMatch在 2.2 中略有改变,这就是为什么它不再与 结合使用的原因$not,它只是一个用于否定其他运算符的元运算符,实际上不能用于搜索字段。

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

例如,

> 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")
        }
    ]
}
于 2012-09-12T16:14:53.517 回答
2

我提交了一个错误“不应使用带有 $not 运算符的查询字段来填充 upsert 文档”,该错误将被反向移植到 2.2.x 中以修复这种情况。

于 2013-01-16T23:21:55.307 回答