使用mongoDB更新多数组字段

时间:2014-03-25 18:58:49

标签: .net arrays mongodb updates

这是我的结构: structure example

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文档中所描述的那样,它只匹配数组的第一个元素。如果我有多个元素,它就不会起作用。

所以我想知道是否有人有一个好主意更新数组中的多项目字段?

提前致谢

2 个答案:

答案 0 :(得分:1)

这听起来像是$elemMatch的工作。 (我知道你说你尝试过位置算子,但你没有详细说明。)

所以,这样的事情应该有效:

db.<some collection>.update({products:{$elemMatch:{reference:2172}}}, {$set:{'products.$.status':-1}})

<击>

由于{multi:true}不起作用,因为每个子文档都在一个文档下,我认为你只有两个选项:

  1. 将符合$elemMatch查询的每个文档拉入您的中 应用程序,编辑它并将其保存回来。

  2. 考虑将您的子文档移动到自己的集合中,以便您的更新能够正常运行。

答案 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)}}
        );
    });
}

它正在运行,但性能不如查询......不管怎样,它只是一种方式,但在有性能要求时,它不能被视为最终解决方案。我问任何找到更好解决方案的人都可以在这篇文章中提供。