sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB-projektets opdaterede post i et indlejret array i findAndModify-forespørgslen

Du kan også prøve positional $ operator brugt med findAndModify() metode. Operatøren vil identificere elementet i et array, der skal opdateres uden eksplicit at specificere elementets position i arrayet. Bemærk, array-feltet skal vises som en del af forespørgselsdokumentet, og for at returnere dokumentet med de ændringer, der er foretaget på opdateringen, skal du bruge den nye mulighed, så din opdatering ville være som

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

vil producere output:

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

Da du ønsker at returnere det opdaterede dokument, med projektion den positionelle $-projektion operatoren kan kun bruges i projektionsdokumentet for find() metoden eller findOne() metoden, så findAndModify() s felt option vil ikke projicere den del af arrayet ved hjælp af $ projektion operatør.

En løsning ville være at bruge det oprindelige JavaScript filter() metode på det returnerede arr-felt som

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

Dette udskrives

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

-- OPDATERING --

Eller $elemMatch projektion, som du foreslog i kommentarerne nedenfor:

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

Output :

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



  1. mongoose index findes allerede med forskellige muligheder

  2. Max og gruppe ved i Mongodb

  3. Busfejl på Mongodb MongoClient.connect() for Raspberry Pi ARM

  4. MongoDB - $project indlejret dokument til rodniveau