3

少しモンゴの問題があります。find複数のandupdate呼び出しではなく、mongoコンソールコマンドで次のことを行う方法があるかどうか疑問に思っていました。

{
    "_id" : ObjectId("50b429ba0e27b508d854483e"),
    "array" : [
        {
            "id" : "1",
            "letter" : "a"
        },
        {
            "id" : "2",
            "letter" : "b"
        }
    ],
    "tester" : "tom"
}

この新しい配列項目でオブジェクトを更新したい

{
    "id": "2",
    "letter": "c"
}

私はこれを使用しましたaddToSetが、制限があります。アイテムが既に存在する場合、配列にアイテムを挿入しませんが、識別子に基づいてアイテムを更新しません。この場合、に基づいてこのエントリを更新したいと思いidます。

db.soup.update({
     "tester": "tom"
 }, {
     $addToSet: {
         "array": {
             "id": "2",
             "letter": "c"
         }
     }
});

これは私に与えます:

{
    "_id" : ObjectId("50b429ba0e27b508d854483e"),
    "array" : [
        {
            "id" : "1",
            "letter" : "a"
        },
        {
            "id" : "2",
            "letter" : "b"
        },
        {
            "id" : "2",
            "letter" : "c"
        }
    ],
    "tester" : "tom"
}

私が本当に欲しかったのは:

{
    "_id" : ObjectId("50b429ba0e27b508d854483e"),
    "array" : [
        {
            "id" : "1",
            "letter" : "a"
        },
        {
            "id" : "2",
            "letter" : "c"
        }
    ],
    "tester" : "tom"
}
4

2 に答える 2

7

$これを行うには、位置演算子を使用できます。

db.soup.update(
    {_id: ObjectId("50b429ba0e27b508d854483e"), 'array.id': '2'}, 
    {$set: {'array.$.letter': 'c'}})

$update オブジェクトの は、arrayクエリ セレクターと一致する の最初の要素のプレースホルダーとして機能します。

于 2012-11-27T03:19:52.363 に答える
0

どうぞ:

> db.collection.insert( { array : [ { id : 1, letter : 'a' }, { id : 2, letter : 'b' } ], tester : 'tom' } );
> db.collection.findOne();
{
    "_id" : ObjectId("50b431a69a0358d590a2f5f0"),
    "array" : [
        {
            "id" : 1,
            "letter" : "a"
        },
        {
            "id" : 2,
            "letter" : "b"
        }
    ],
    "tester" : "tom"
}
> db.collection.update( { tester : 'tom' }, { $set : { 'array.1' : { id : 2, letter : 'c' } } }, false, true );
> db.collection.findOne();
{
    "_id" : ObjectId("50b431a69a0358d590a2f5f0"),
    "array" : [
        {
            "id" : 1,
            "letter" : "a"
        },
        {
            "id" : 2,
            "letter" : "c"
        }
    ],
    "tester" : "tom"
}

トリックは、false、true、false にあります。つまり、upsert の場合は true、複数の更新の場合は false です。

詳細については、 http ://www.mongodb.org/display/DOCS/Updating#Updating-update%28%29 をご覧ください。

于 2012-11-27T03:25:08.787 に答える