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

の動作は2.2 でわずかに変更されました。これが、他の演算子を否定するための単なるメタ演算子であり、実際にはフィールドの検索に使用できない と$elemMatch組み合わせて機能しなくなった理由です。$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 演算子を含むクエリ フィールドは、アップサート ドキュメントの作成に使用しないでください」というバグを報告しました。これは、この状況を修正する 2.2.x にバックポートされます。

于 2013-01-16T23:21:55.307 に答える