sql >> Database >  >> NoSQL >> MongoDB

Is er een manier om de gewijzigde IDS uit de bulkoperaties van mongodb te halen met behulp van mangoest?

Nou, vanuit één oogpunt is het antwoord "nee" en daar is een heel goede reden voor.

Over het algemeen zijn de "update" -bewerkingen van MongoDB bedoeld om te werken in wat gewoonlijk "meerdere" documenten zijn, wat betekent dat alles overeenkomt met de criteria. Dus het algemene geval hier is dat wat je ofwel vroeg om te worden bijgewerkt in het enkelvoud of door selectie, al dan niet werd bijgewerkt, afhankelijk van of er iets overeenkwam.

In de "Bulk"-context is veel van hetzelfde van toepassing, in die zin dat er al dan niet een criteriaovereenkomst was, in welk geval u geretourneerde waarden krijgt voor nMatched en nModified respectievelijk, aangezien er ook de mogelijkheid is dat een "gematcht" document niet daadwerkelijk wordt bijgewerkt wanneer de gegevens die aanwezig zijn om te worden gewijzigd al de waarde is die het doel van de wijziging is.

Dat laatste onderscheid tussen nMatched en nModified is de belangrijkste reden waarom "je dit niet op betrouwbare wijze kunt doen" , omdat niet alles wat overeenkomt, noodzakelijkerwijs wordt gewijzigd.

U kunt echter wel een guestimate maken waarde in het geval van onderscheid tussen "upsert"-acties en daadwerkelijke "updates". Het zal niet 100% nauwkeurig zijn vanwege het opgemerkte onderscheid, maar het basisproces is om uw invoerlijst te vergelijken met de geretourneerde waarde van getUpsertedIds() , wat een geldige oproep is.

Op dit moment de ES6-syntaxis negeren voor de rest van de wereld:

var upserted = result.getUpsertedIds();    // get this from the bulk result

upserted = upserted.map(function(up) { return up._id }); // filter out just the _id values

var modifiedIds = edges.map(function(edge) {    // get _id only from source 
    return edge.id;  
}).filter(function(edge) {
    return upserted.indexOf(edge) == -1;        // and return only non upserted
});

Waar het geretourneerde resultaat van van .getUpsertedIds() is een array van objecten die zowel de "index"-positie van de bulkupdate als de gegenereerde of geleverde _id bevatten waarde van de "upsert".

[ { index: 0, _id: 1 } ]

Dus vergelijk uw invoerlijst met de "upserted" lijst om "wat er niet is" te zien , retourneert in feite dingen die waarschijnlijk zojuist gewijzigd. Met natuurlijk het voorbehoud dat als de waarde al hetzelfde was als de wijziging, het eigenlijk helemaal geen wijziging was.

Maar vanwege de manier waarop de API zou moeten werken, komt dat zo dicht mogelijk in de buurt.




  1. Hoe het sharding-bereik voor elke shard in Mongo te definiëren?

  2. Hoe update ik velden van documenten in mongo db met behulp van het java-stuurprogramma?

  3. Hoe kan ik met Predis een multidimensionale associatieve array INSTELLEN (d.w.z. opslaan)?

  4. Mongodb-array $push en $pull