編集
質問に欠けている詳細は、更新に必要なフィールドが実際にはサブドキュメントにあるということでした。 。これにより、答えが大幅に変わります:
これは、おそらくできることの制約です。 配列要素の更新を行います。そして、これはドキュメント で明確に説明されています。 。主にこの段落で:
だからここにあるのです。 すべてを更新しようとしています このような単一のステートメント内の配列要素の数はありません 仕事。これを行うには、次のことを行う必要があります。
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 );
})
これは基本的にすべてを更新する方法です 配列要素。
マルチ .update()
での設定 複数の「ドキュメント」にまたがることを意味します。 できません 配列の複数の要素に適用されます。したがって、現時点で最良のオプションは、すべてを置き換えることです。または、この場合、全体を置き換えることもできます とにかくそれをする必要があるので文書化してください。
本物の場合 バルクデータの場合は、 db.eval()を使用します 。ただし、お読みください 最初のドキュメント:
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 );
});
})
すべてを更新しています 全体全体の配列内の要素 コレクションは単純ではありません。
オリジナル
エラーの内容とほぼ同じです。位置演算子を使用するには、一致する必要があります 最初に何か。のように:
db.warehouses.update(
// query
{
_id:ObjectId('5322f07e139cdd7e31178b78'),
"items.qty": { "$gt": 0 }
},
// update
{
$set:{"items.$.qty":0}
},
// options
{
"multi" : true,
"upsert" : true
}
);
つまり、一致 条件は位置をフィンします 未満のアイテムの 0次にそのインデックス 位置演算子に渡されます。
P.S :ムティの場合 true すべて更新されることを意味します 資料。 false
のままにします 1つだけを意味する場合 。これがデフォルトです。