sql >> Database >  >> NoSQL >> MongoDB

Hoe krijg ik de nieuwe waarde terug na een update in een ingesloten array?

Als u MongoDB 3.0 of nieuwer gebruikt, moet u de .findOneAndUpdate() gebruiken en gebruik projection optie om de subset van te retourneren velden op te geven. U moet ook returnNewDocument . instellen naar true . Natuurlijk moet je de $elemMatch . gebruiken projectie-operator hier omdat u geen positionele projectie kunt gebruiken en het nieuwe document kunt retourneren.

Zoals iemand opmerkte:

U zou .findOneAndUpdate() . moeten gebruiken omdat .findAndModify() wordt gemarkeerd als verouderd in elke officiële taaldriver. Het andere is dat de syntaxis en opties vrij consistent zijn in alle stuurprogramma's voor .findOneAndUpdate() . Met .findAndModify() , gebruiken de meeste stuurprogramma's niet hetzelfde enkele object met "query/update/fields"-sleutels. Het is dus een beetje minder verwarrend wanneer iemand een aanvraag indient voor een andere taal om consistent te zijn. Gestandaardiseerde API-wijzigingen voor .findOneAndUpdate() komt eigenlijk overeen met serverversie 3.x in plaats van 3.2.x. Het volledige onderscheid is dat de shell-methoden bij het implementeren van de methode feitelijk (voor een keer!) achterbleven op de andere stuurprogramma's. Dus de meeste stuurprogramma's hadden eigenlijk een grote release-bump die overeenkomt met de 3.x-release met dergelijke wijzigingen.

db.collection.findOneAndUpdate( 
    { 
        "_id": ObjectId("56d6a7292c06e85687f44541"), 
         "rankings._id" : ObjectId("46d6a7292c06e85687f55543") 
    },  
    { $inc : { "rankings.$.score" : 1 } },  
    { 
        "projection": { 
            "rankings": { 
                "$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") } 
            }
        }, 
        "returnNewDocument": true 
    }
)

Vanaf MongoDB 3.0 moet u findAndModify . gebruiken en de fields opties moet je ook new instellen naar true in andere om de nieuwe waarde te retourneren.

db.collection.findAndModify({   
    query: { 
        "_id": ObjectId("56d6a7292c06e85687f44541"), 
        "rankings._id" : ObjectId("46d6a7292c06e85687f55543") 
    },     
    update: { $inc : { "rankings.$.score" : 1 } },       
    new: true,  
    fields: { 
        "rankings": { 
            "$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") }
        }  
    }
})

Beide zoekopdrachten leveren:

{
        "_id" : ObjectId("56d6a7292c06e85687f44541"),
        "rankings" : [
                {
                        "_id" : ObjectId("46d6a7292c06e85687f55543"),
                        "name" : "Ranking 2",
                        "score" : 11
                }
        ]
}



  1. Redis (ioredis) - Kan verbindingsfout niet opvangen om ze netjes af te handelen

  2. Redis-server stoppen. Noch afsluiten, noch stoppen werkt

  3. flushdb wist niet alle sleutels in redis?

  4. MongoDB-replicaset met eenvoudige wachtwoordverificatie