MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Aktualisierter Datensatz des MongoDB-Projekts in einem verschachtelten Array in der findAndModify-Abfrage

Sie können auch den Positionscode $ Operator, der mit findAndModify() Methode. Der Operator identifiziert das zu aktualisierende Element in einem Array, ohne die Position des Elements im Array explizit anzugeben. Beachten Sie, dass das Array-Feld als Teil des Abfragedokuments erscheinen muss, und um das Dokument mit den beim Update vorgenommenen Änderungen zurückzugeben, verwenden Sie die neue Option, damit Ihr Update wie folgt aussehen würde

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

erzeugt die Ausgabe:

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

Da Sie das aktualisierte Dokument zurückgeben möchten, müssen Sie mit der Projektion die Position $-Projektion Operator kann nur im Projektionsdokument von find() verwendet werden Methode oder die findOne() Methode, also den findAndModify() Feld von Die Option projiziert diesen Teil des Arrays nicht mit $-Projektion Betreiber.

Eine Problemumgehung wäre die Verwendung des nativen JavaScripts filter() Methode für das zurückgegebene arr-Feld als

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

Dies wird gedruckt

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

-- AKTUALISIEREN --

Oder $elemMatch Projektion, wie Sie in den Kommentaren unten vorgeschlagen haben:

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

Ausgabe :

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