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

Nogen måde at få det modificerede IDS fra mongodbs bulkoperationer ved hjælp af mongoose?

Fra et synspunkt er svaret "nej", og det er der en meget god grund til.

Generelt er MongoDB "opdaterings"-operationer beregnet til at fungere på tværs af, hvad der almindeligvis er "flere" dokumenter, hvilket betyder, hvad der end matchede kriterierne. Så det generelle tilfælde her er, hvad end du enten bad om at blive opdateret i enten ental eller ved valg enten blev opdateret eller ej, afhængigt af om noget blev matchet.

I "Bulk"-konteksten gælder meget af det samme, idet der enten var et kriteriematch eller ej, i hvilket tilfælde du vil få returnerede værdier for nMatched og nModified da der også er mulighed for, at et "matchet" dokument faktisk ikke opdateres, hvor de tilstedeværende data, der skal ændres, allerede er den værdi, som er målet for ændringen.

Den sidste skelnen mellem nMatched og nModified er den primære årsag til, at "du ikke kan gøre dette pålideligt" , da ikke alt matchet nødvendigvis er ændret.

Du kan dog lave et gæst værdi i tilfælde af at skelne mellem "upsert"-handlinger og faktiske "opdateringer". Den vil ikke være 100 % nøjagtig på grund af den noterede skelnen, men den grundlæggende proces er at sammenligne din inputliste med den returnerede værdi fra getUpsertedIds() , hvilket er et gyldigt opkald.

Undgå ES6-syntaksen for resten af ​​verden i øjeblikket:

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

Hvor det returnerede resultat fra .getUpsertedIds() er en matrix af objekter, der indeholder både "indeks"-positionen fra masseopdateringen og den genererede eller leverede _id værdien af ​​"upsert".

[ { index: 0, _id: 1 } ]

Så match din inputliste mod den "opsatte" liste for at se "hvad er der ikke" , returnerer dybest set ting, der hvor sandsynligvis var lige ændret. Selvfølgelig med det forbehold, at hvis værdien allerede var den samme som modifikationen, så var det virkelig slet ikke en modifikation.

Men på grund af hvordan API'en er beregnet til at fungere, er det så tæt på, som du kommer.




  1. Opret superbruger i mongo

  2. Mongodb-beregningsforespørgsel - kumulativ multiplikation

  3. Kan ikke godkendes til mongo, godkendelse mislykkes

  4. Transform keymap til vektor ved hjælp af MongoDB framework