Jak již bylo zmíněno, hlavním problémem je zde aktualizace více prvků s pozičním operátorem, jak je zaznamenáno v tomto dlouhodobém vydání:http://jira.mongodb.org/browse/SERVER-1243
Základním případem proto je, že to nemůže udělat jediné spuštění, takže pro zpracování více prvků pole potřebujete nějakou metodu, jak určit, kolik prvků potřebujete aktualizovat a zpracovat jeden příkaz aktualizace pro každý prvek.
Zjednodušeným přístupem je obecně použití Hromadné operace zpracovat to, co skončí jako „vícenásobné“ aktualizační operace jako jediný požadavek a odpověď na server:
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();
Pokud jsou vaše aktualizované dokumenty poměrně malé nebo skutečně pouze jeden dokument, můžete se count
vzdát zkontrolujte a jednoduše připojte všechny hromadné aktualizace v rámci požadovaných smyček a na konci všech smyček je spusťte pouze jednou.
Delší vysvětlení a alternativy lze nalézt na stránce Jak aktualizovat více prvků pole
, ale všechny se týkají různých přístupů k přiřazování prvku k aktualizaci a zpracování poziční $
aktualizujte vícekrát, buď pro každý odpovídající dokument, nebo dokud nebudou vráceny žádné další upravené dokumenty.