sql >> Databáze >  >> NoSQL >> MongoDB

Existuje způsob, jak získat upravený IDS z hromadných operací mongodb pomocí mongoose?

Z jednoho úhlu pohledu je odpověď „ne“ a je pro to velmi dobrý důvod.

Obecně řečeno, operace „aktualizace“ MongoDB jsou určeny pro práci s tím, co je běžně „více“ dokumentů, tedy cokoli, co odpovídá kritériím. Obecným případem je tedy vše, co jste buď požádali o aktualizaci buď v jednotném čísle, nebo podle výběru, bylo nebo nebylo aktualizováno v závislosti na tom, zda se něco shodovalo.

V kontextu "Hromadné" platí hodně z toho samého, že buď došlo ke shodě kritérií, nebo ne, v takovém případě získáte vrácené hodnoty pro nMatched a nModified v tomto pořadí, protože existuje také možnost, že "shodný" dokument není ve skutečnosti aktualizován, pokud přítomná data, která mají být upravena, jsou již hodnotou, která je cílem modifikace.

Poslední rozdíl mezi nMatched a nModified je hlavním důvodem, proč "toto nemůžete spolehlivě udělat" , protože ne vše, co se shoduje, je nutně upraveno.

Můžete však vytvořit návrh hodnotu v případě rozlišení mezi akcemi „upsert“ a skutečnými „aktualizacemi“. Kvůli uvedenému rozdílu to nebude 100% přesné, ale základním postupem je porovnat váš vstupní seznam s hodnotou vrácenou z getUpsertedIds() , což je platné volání.

Vyhýbání se syntaxi ES6 pro zbytek světa v současnosti:

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

Kde je vrácený výsledek z .getUpsertedIds() je pole objektů obsahující jak pozici "index" z hromadné aktualizace, tak vygenerovaný nebo dodaný _id hodnota "upsert".

[ { index: 0, _id: 1 } ]

Porovnejte tedy svůj vstupní seznam se seznamem „upserted“, abyste viděli „co tam není“ , v podstatě vrací věci, které pravděpodobně právě upraveno. Samozřejmě s upozorněním, že pokud již hodnota byla stejná jako modifikace, pak to ve skutečnosti vůbec nebyla modifikace.

Ale vzhledem k tomu, jak má API fungovat, je to tak blízko, jak se dostanete.




  1. Rozdíl mezi MongoDB a Mongoose

  2. Odstranění nejnovějšího dokumentu z Mongo DB v jediném dotazu

  3. Facebook user_id jako MongoDB BSON ObjectId?

  4. Hledání dokumentů podle řady DBRefs