BEWERKEN
Het detail dat ontbrak in de vraag was dat het vereiste veld om bij te werken zich in een subdocument bevond . Dit verandert het antwoord aanzienlijk:
Dit is een beperking van wat u mogelijk . kunt doen doen met het bijwerken van array-elementen. En dit wordt duidelijk uitgelegd in de documentatie . Meestal in deze paragraaf:
Dus hier is het ding. Probeert alles bij te werken van de array-elementen in een enkele instructie zoals deze zal niet werk. Om dit te doen moet je het volgende doen.
db.warehouses.find({ "items.qty": { "$gt": 0 } }).forEach(function(doc) {
doc.items.forEach(function(item) {
item.qty = 0;
});
db.warehouses.update({ "_id": doc._id }, doc );
})
Dat is eigenlijk de manier om elke . bij te werken array-element.
De multi instelling in .update()
betekent over meerdere "documenten". Het kan niet worden toegepast op meerdere elementen van een array. Dus momenteel is de beste optie om het hele ding te vervangen. Of in dit geval kunnen we net zo goed het geheel . vervangen document, aangezien we dat toch moeten doen.
Voor echt bulkgegevens, gebruik db.eval() . Maar lees alstublieft de documentatie eerst:
db.eval(function() {
db.warehouses.find({ "items.qty": { "$gt": 0 } }).forEach(function(doc) {
doc.items.forEach(function(item) {
item.qty = 0;
});
db.warehouses.update({ "_id": doc._id }, doc );
});
})
alle bijwerken de elementen in een array over het geheel verzamelen is niet eenvoudig.
Origineel
Vrijwel precies wat de fout zegt. Om een positionele operator te gebruiken, moet je gelijken eerst iets. Zoals in:
db.warehouses.update(
// query
{
_id:ObjectId('5322f07e139cdd7e31178b78'),
"items.qty": { "$gt": 0 }
},
// update
{
$set:{"items.$.qty":0}
},
// options
{
"multi" : true,
"upsert" : true
}
);
Dus waar de overeenkomst voorwaarde vinnen de positie van de items die minder dan . zijn 0 dan die index wordt doorgegeven aan de positionele operator.
PS :Wanneer muti is waar het betekent dat het elke . bijwerkt document. Laat het false
als je maar één bedoelt . Dat is de standaardinstelling.