Som nævnt er hovedproblemet her med opdateringer om flere elementer med positionsoperatøren som registreret i dette langvarige problem:http://jira.mongodb.org/browse/SERVER-1243
Det grundlæggende tilfælde er derfor, at ingen enkelt eksekvering kan gøre dette, så for at behandle for flere array-elementer har du brug for en metode til at bestemme, hvor mange elementer du skal opdatere og behandle en opdateringssætning pr. hvert element.
En forenklet tilgang til dette er generelt at bruge Bulk Operations at behandle det, der ender med at blive "flere" opdateringsoperationer som en enkelt anmodning og svar til serveren:
var bulk = db.collection.initializeOrderedBulkOp(),
count = 0;
db.collection.find({ "name": "John Doe", "adds.status": "PENDING" }).forEach(function(doc) {
doc.adds.filter(function(add){ return add.status = "PENDING" }).forEach(function(add) {
bulk.find({ "_id": doc._id, "adds.status": "PENDING" }).updateOne({
"$set": { "adds.$.status": "APPROVED" }
});
count++;
// Execute once in 1000 statements created and re-init
if ( count % 1000 == 0 ) {
bulk.execute();
bulk = db.collection.initializeOrderedBulkOp();
}
});
});
// Execute any pending operations
if ( count % 1000 != 0 )
bulk.execute();
Hvis dine opdaterede dokumenter er ret små, eller faktisk kun et enkelt dokument, kan du undlade count
tjek og tilføj blot alle masseopdateringer inden for de påkrævede sløjfer, og kør bare én gang i slutningen af alle sløjfer.
En længere forklaring og alternativer kan findes på Sådan opdaterer du flere array-elementer
, men alle kommer ned til forskellige tilgange til at matche elementet for at opdatere og behandle en positionel $
opdatere flere gange, for enten hvert dokument, der matches, eller indtil der ikke er flere ændrede dokumenter returneret.