sql >> データベース >  >> NoSQL >> MongoDB

MongoDBプロジェクトは、findAndModifyクエリのネストされた配列のレコードを更新しました

    positional $> <で使用される演算子code> findAndModify() 方法。演算子は、配列内の要素の位置を明示的に指定せずに、更新する配列内の要素を識別します。配列フィールドはクエリドキュメントの一部として表示される必要があり、更新時に行われた変更を含むドキュメントを返すには、新しいオプションを使用する必要があるため、更新は次のようになります

    db.tests.findAndModify({
        query: {
            "arr.cond": 4
        },
        update: {
            "$set": {"arr.$.upd": 55 }
        },
        new : true,
        fields: { "arr": 1, "_id": 0 }   
    })
    

    出力を生成します:

    {
        "arr": [
            {
                "cond" : 1,
                "upd" : 2
            },
            {
                "cond" : 2,
                "upd" : 3
            },
            {
                "cond" : 4,
                "upd" : 55
            },
            {
                "cond" : 6,
                "upd" : 7
            },
            {
                "cond" : 8,
                "upd" : 9
            }
        ]
    }
    

    更新されたドキュメントを返したいので、プロジェクションを使用して、位置 $プロジェクション 演算子は、 find()の投影ドキュメントでのみ使用できます メソッドまたはfindOne() メソッドなので、 findAndModify() フィールド オプションは、 $プロジェクション オペレーター。

    回避策は、ネイティブJavaScriptを使用することです filter() 返されたarrフィールドのメソッド

    var result = db.tests.findAndModify({
        query: {
            "arr.cond": 4
        },
        update: {
            "$set": {"arr.$.upd": 55 }
        },
        new : true,
        fields: { "arr": 1, "_id": 0 }   
    })
    
    var updated = []
    if (result && result.arr) updated = result.arr.filter(function (item) { return item.cond == 4; });
    printjson(updated);
    

    これで印刷されます

    [ { "cond" : 4, "upd" : 55 } ]
    

    -更新 -

    または、 $ elemMatch 以下のコメントで提案したように、投影:

    var result = db.tests.findAndModify({
        query: {
            "arr.cond": 4
        },
        update: {
            "$set": {"arr.$.upd": 55 }
        },
        new : true,
        fields: {"arr": {"$elemMatch": { "cond": 4 } }, "_id": 0 }   
    })
    
    printjson(result);
    

    出力

    { "arr" : [ { "cond" : 4, "upd" : 55 } ] }
    



    1. pymongoのReplicaSetConnectionの使用:時々IndexErrorを取得します:カーソルにそのような項目はありません

    2. mongodbローカルサーバーを起動できません

    3. コマンドカーソルのオブジェクトは添え字化できません

    4. mongodbの小数点以下第2位に四捨五入