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

Un modo per ottenere l'IDS modificato dalle operazioni di massa di mongodb utilizzando mongoose?

Ebbene, da un certo punto di vista la risposta è "no" e c'è un'ottima ragione per questo.

In generale, le operazioni di "aggiornamento" di MongoDB hanno lo scopo di funzionare su quelli che sono comunemente documenti "multipli", quindi qualsiasi cosa soddisfi i criteri. Quindi il caso generale qui è tutto ciò che hai chiesto di aggiornare al singolare o per selezione è stato aggiornato o meno a seconda che qualcosa fosse abbinato.

Nel contesto "In blocco", si applica più o meno la stessa cosa, in quanto c'era una corrispondenza o meno dei criteri, nel qual caso otterrai valori restituiti per nMatched e nModified rispettivamente, in quanto esiste anche la possibilità che un documento "corrispondente" non venga effettivamente aggiornato laddove il dato presente da modificare sia già il valore che è l'obiettivo della modifica.

L'ultima distinzione tra nMatched e nModified è il motivo principale per cui "non puoi farlo in modo affidabile" , poiché non tutto ciò che trova corrispondenza viene necessariamente modificato.

Puoi comunque fare una stima valore nel caso di discernimento tra azioni "upsert" ed effettivi "aggiornamenti". Non sarà accurato al 100% a causa della distinzione annotata, ma il processo di base consiste nel confrontare l'elenco di input con il valore restituito da getUpsertedIds() , che è una chiamata valida.

Evitando la sintassi ES6 per il resto del mondo al momento:

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

Dove il risultato restituito da .getUpsertedIds() è un array di oggetti contenente sia la posizione "index" dall'aggiornamento in blocco che il _id generato o fornito valore dell'"upsert".

[ { index: 0, _id: 1 } ]

Quindi confronta il tuo elenco di input con l'elenco "upserted" per vedere "cosa non c'è" , fondamentalmente restituisce cose dove probabilmente appena modificato. Ovviamente con l'avvertenza che se il valore era già lo stesso della modifica, in realtà non si trattava affatto di una modifica.

Ma a causa del modo in cui l'API dovrebbe funzionare, è il più vicino possibile.