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.