sql >> Database >  >> NoSQL >> MongoDB

MongoDB-project bijgewerkt record in een geneste array in findAndModify-query

Je kunt ook de positionele $ operator gebruikt met de findAndModify() methode. De operator identificeert het element in een array dat moet worden bijgewerkt zonder expliciet de positie van het element in de array op te geven. Let op, het matrixveld moet verschijnen als onderdeel van het querydocument en om het document terug te geven met de wijzigingen die bij de update zijn aangebracht, gebruikt u de nieuwe optie, zodat uw update eruit zou zien

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

zal de output produceren:

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

Aangezien u het bijgewerkte document wilt retourneren, met projectie de positionele $ projectie operator kan alleen worden gebruikt in het projectiedocument van de find() methode of de findOne() methode dus de findAndModify() 's veld optie zal dat deel van de array niet projecteren met behulp van de $ projectie telefoniste.

Een tijdelijke oplossing zou zijn om het native JavaScript filter() methode in het geretourneerde arr-veld 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);

Dit wordt afgedrukt

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

-- UPDATE --

Of de $elemMatch projectie zoals je suggereerde in de opmerkingen hieronder:

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

Uitvoer :

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



  1. Hoe het verwijderen in MongoDB te beperken voor het verzamelen van relaties

  2. Fout:Kan geen verbinding maken met Redis op redis:6379:Naam of service niet bekend

  3. Hoe de vervaldatum in te stellen op meerdere sleutels in Redis

  4. Hoe kan ik de huidige dag per maand tellen in laravel?