sql >> Databasteknik >  >> NoSQL >> MongoDB

Något sätt att få den modifierade IDS från mongodbs bulkverksamhet med hjälp av mongoose?

Tja ur en synvinkel är svaret "nej" och det finns en mycket god anledning till det.

Generellt sett är MongoDB "uppdaterings"-operationer avsedda att fungera över vad som vanligtvis är "flera" dokument, vilket betyder vad som än matchar kriterierna. Så det allmänna fallet här är vad du än bad om att uppdateras i antingen singular eller genom att urvalet antingen uppdaterades eller inte, beroende på om något matchades.

I "Mass"-sammanhang gäller mycket av samma sak, i det att det antingen fanns en kriteriematchning eller inte, i vilket fall du får returnerade värden för nMatched och nModified eftersom det också finns möjligheten att ett "matchat" dokument faktiskt inte uppdateras där de data som finns som ska modifieras redan är det värde som är målet för modifieringen.

Den sista skillnaden mellan nMatched och nModified är den främsta anledningen till att "du inte kan göra detta på ett tillförlitligt sätt" , eftersom inte allt som matchas nödvändigtvis modifieras.

Du kan dock göra en gäst värde i fallet med att skilja mellan "upsert"-åtgärder och faktiska "uppdateringar". Det kommer inte att vara 100 % korrekt på grund av den noterade skillnaden, men den grundläggande processen är att jämföra din indatalista med det returnerade värdet från getUpsertedIds() , vilket är ett giltigt samtal.

Undviker ES6-syntaxen för resten av världen för närvarande:

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

Där det returnerade resultatet från .getUpsertedIds() är en array av objekt som innehåller både "index"-positionen från massuppdateringen och den genererade eller tillhandahållna _id värdet för "upsert".

[ { index: 0, _id: 1 } ]

Så matcha din inmatningslista mot den "uppskjutna" listan för att se "vad som inte finns där" , returnerar i princip saker som förmodligen var just modifierad. Naturligtvis med förbehållet att om värdet redan var detsamma som ändringen, så var det verkligen inte en ändring alls.

Men på grund av hur API:et är tänkt att fungera är det så nära du kommer.




  1. varför får jag favicon.ico när jag använder findOne-metoden för express params-rutter?

  2. Två samtidiga förfrågningar blandas ihop i Node.js-appen

  3. Mongoid misslyckas på ruby ​​1.9.3

  4. Hur tar man bort min-värde i mongodb för grupp?