Ами от една гледна точка отговорът е „не“ и има много добра причина за това.
Най-общо казано, операциите за „актуализация“ на MongoDB са предназначени да работят в това, което обикновено е „множество“ документи, следователно означава каквото отговаря на критериите. Така че общият случай тук е всичко, което или поискахте да бъде актуализирано в единствено число, или чрез избор, или беше актуализирано, или не, в зависимост от това дали има съвпадение.
В контекста на „Групово“ важи почти същото нещо, тъй като има или съвпадение на критерии, или не, в който случай ще получите върнати стойности за nMatched
и nModified
респективно, тъй като има и възможност „съвпадащият“ документ да не бъде действително актуализиран, когато наличните данни за модифициране вече са стойността, която е целта на модификацията.
Това последно разграничение между nMatched
и nModified
е основната причина "не можете надеждно да направите това" , тъй като не всичко съвпадащо е непременно модифицирано.
Можете обаче да направите предварителна оценка стойност в случай на разграничаване между действията „upsert“ и действителните „актуализации“. Няма да е 100% точен поради отбелязаното разграничение, но основният процес е да сравните списъка си с въведени данни с върнатата стойност от getUpsertedIds()
, което е валидно повикване.
Избягване на синтаксиса на ES6 за останалия свят в момента:
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
});
Където е върнатият резултат от .getUpsertedIds()
е масив от обекти, съдържащ както позицията на "индекс" от груповата актуализация, така и генерирания или предоставен _id
стойност на "upsert".
[ { index: 0, _id: 1 } ]
Така че съпоставяне на вашия входен списък с "повторения" списък, за да видите "какво го няма" , основно връща неща, които са вероятно просто модифициран. Разбира се, с уговорката, че ако стойността вече е същата като модификацията, тогава това наистина не е никаква модификация.
Но поради начина, по който API е предназначен да работи, това е възможно най-близо.