sql >> Databáze >  >> NoSQL >> MongoDB

Projekt MongoDB aktualizoval záznam ve vnořeném poli v dotazu findAndModify

Můžete také vyzkoušet positional $ operátor používaný s findAndModify() metoda. Operátor identifikuje prvek v poli, který se má aktualizovat, aniž by explicitně specifikoval pozici prvku v poli. Všimněte si, že pole pole se musí objevit jako součást dokumentu dotazu a chcete-li vrátit dokument s úpravami provedenými při aktualizaci, použijte novou možnost, takže vaše aktualizace bude vypadat takto

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

vytvoří výstup:

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

Protože chcete vrátit aktualizovaný dokument, s projekcí pozičního $ projection Operátor lze použít pouze v projekčním dokumentu find() nebo findOne() metoda, takže findAndModify() field možnost nepromítne tuto část pole pomocí $ projection operátor.

Řešením by bylo použití nativního JavaScriptu filter() metoda na vráceném poli arr jako

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);

Tím se vytiskne

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

-- AKTUALIZACE --

Nebo $elemMatch projekce, jak jste navrhli v komentářích níže:

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);

Výstup :

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



  1. Cluster Failover

  2. Redis :Jak mohu třídit svůj hash podle klíčů?

  3. Seskupování dokumentů do dvojic pomocí mongo agregace

  4. Výkon MongoDB s rostoucí datovou strukturou