MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Alguma maneira de obter o IDS modificado das operações em massa do mongodb usando o mongoose?


Bem, de um ponto de vista, a resposta é "não" e há uma razão muito boa para isso.

De um modo geral, as operações de "atualização" do MongoDB destinam-se a funcionar em documentos comumente "múltiplos", portanto, significando o que corresponde aos critérios. Portanto, o caso geral aqui é o que você pediu para ser atualizado no singular ou por seleção foi atualizado ou não, dependendo se algo foi correspondido.

No contexto "Em massa", quase a mesma coisa se aplica, pois houve uma correspondência de critérios ou não, caso em que você obterá valores retornados para nMatched e nModified respectivamente, pois também existe a possibilidade de que um documento "combinado" não seja realmente atualizado quando os dados presentes a serem modificados já forem o valor que é o alvo da modificação.

Essa última distinção entre nMatched e nModified é a principal razão pela qual "você não pode fazer isso de forma confiável" , uma vez que nem tudo que corresponde é necessariamente modificado.

No entanto, você pode fazer uma guestimate valor no caso de discernir entre as ações "upsert" e as "atualizações" reais. Não será 100% preciso devido à distinção observada, mas o processo básico é comparar sua lista de entrada com o valor retornado de getUpsertedIds() , que é uma chamada válida.

Evitando a sintaxe ES6 para o resto do mundo no 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
});

Onde o resultado retornado de .getUpsertedIds() é uma matriz de objetos contendo a posição "index" da atualização em massa e o _id gerado ou fornecido valor do "upsert".
[ { index: 0, _id: 1 } ]

Portanto, compare sua lista de entrada com a lista "invertida" para ver "o que não está lá" , basicamente retorna coisas que provavelmente apenas modificado. Claro, com a ressalva de que se o valor já era o mesmo que a modificação, então realmente não era uma modificação.

Mas devido à forma como a API deve funcionar, isso é o mais próximo que você vai conseguir.