这是我的结构:
M 1 ---->
Produits Array ----->
0 ----->
----> Id: 0
----> Status : 0
----> Id: 1
----> Status : 0
----> Id: 2
----> Status : 0
1 ----->
----> Id: 3
----> Status : 0
----> Id: 4
----> Status : 0
----> Id: 5
----> Status : 0
2 ----->
----> Id: 6
----> Status : 0
----> Id: 7
----> Status : 0
----> Id: 8
----> Status : 0
M 2 ---->
Produits Array ----->
0 ----->
----> Id: 9
----> Status : 0
----> Id: 10
----> Status : 0
----> Id: 11
----> Status : 0
如您所见,主对象中的Produits
字段是一个对象数组。
现在,我想更新每个Status
数组中对象的所有Produits
字段,其中引用为2172, 2173, etc.
,值为-1
我在互联网上搜索,我找到的所有内容都是foreach
方法,这些方法无法为服务器提供快速性能。
我也尝试过运营商$
。但正如Mongo文档中所描述的那样,它只匹配数组的第一个元素。如果我有多个元素,它就不会起作用。
所以我想知道是否有人有一个好主意更新数组中的多项目字段?
提前致谢
答案 0 :(得分:1)
这听起来像是$elemMatch的工作。 (我知道你说你尝试过位置算子,但你没有详细说明。)
所以,这样的事情应该有效:
db.<some collection>.update({products:{$elemMatch:{reference:2172}}}, {$set:{'products.$.status':-1}})
击> <击> 撞击>
由于{multi:true}
不起作用,因为每个子文档都在一个文档下,我认为你只有两个选项:
将符合$elemMatch
查询的每个文档拉入您的中
应用程序,编辑它并将其保存回来。
考虑将您的子文档移动到自己的集合中,以便您的更新能够正常运行。
答案 1 :(得分:0)
我终于找到了一个&#34;解决方案&#34;通过使用存储函数:
function UpdateStatusProduits (produitsReference, status) {
if (produitsReference.length === 0) {
return;
}
produitsReference.forEach(function(reference) {
db.Prodel.update(
{"Produits.Reference": reference},
{ $set: { "Produits.$.Status": NumberInt(status)}}
);
});
}
它正在运行,但性能不如查询......不管怎样,它只是一种方式,但在有性能要求时,它不能被视为最终解决方案。我问任何找到更好解决方案的人都可以在这篇文章中提供。