向嵌入式文档添加其他字段

时间:2016-10-25 10:00:27

标签: mongodb mongodb-query mongodb-update

我在MongoDB数据库中广泛使用嵌入式文档,并且在尝试添加其他数据时遇到了速度问题:

作为一个例子,我有一个看起来有点像这样的文件:

    {
       "date" : <<the date>>
       "name" : "thisName"
       "basket": [
                   {
                     "stock": "IBM",
                     "quantity": 1000.0,
                     "profit"  : 10:0,
                   },
                   ...
                   {
                     "stock": "MSFT",
                     "quantity": 2000.0,
                     "profit"  : 30:0,
                   },

                 ]
}

我想要做的是在嵌入式文档中添加5个新字段,如下所示:

    {
       "date" : <<the date>>
       "name" : "thisName"
       "basket": [
                   {
                     "stock": "IBM",
                     "quantity": 1000.0,
                     "profit"  : 10:0,
                     "new_1"  : 10:0,
                     "new_2"  : 10:0,
                     "new_3"  : 10:0,
                     "new_4"  : 10:0,
                     "new_4"  : 10:0,
                     "new_5"  : 10:0
                   },
                   ...
                   {
                     "stock": "MSFT",
                     "quantity": 2000.0,
                     "profit"  : 30:0,
                     "new_1"  : 10:0,
                     "new_2"  : 10:0,
                     "new_3"  : 10:0,
                     "new_4"  : 10:0,
                     "new_4"  : 10:0,
                     "new_5"  : 10:0
                   },

                 ]
}

我开始在for循环中使用find()。update_one(),明确标识每个嵌入文档并使用“$ set”显式使用文档。这种方法有效,但速度很慢。如果我的收藏很小,我肯定这不重要,但因为它是巨大的(百万的文件中有100个)。它可能很慢,因为每次添加一组字段时都必须移动整个文档。考虑到这一点,我试图一次性将新字段添加到所有嵌入的文档中。我这样做是将查询查询留空并从“$ set”命令中删除位置$。有点像这样(在pymongo):

bulk.find({"date": dates[i],
           "strategyId": strategyInfo[siOffset[l]][ID]
          }).update({
                     "$set": {
                          "basket.new_1": 0.0,
                          "basket.new_2": 0.0,
                          "basket.new_3": 0.0,
                          "basket.new_4": 0.0,
                          "basket.new_5": 0.0
                         }
                      })

这种方法似乎抛出错误cannot use the part (basket of basket.new_5) to traverse the element ({basket:......

是否有人能够对我做错了什么有所了解?甚至可以这样做吗?

1 个答案:

答案 0 :(得分:1)

您可以使用这样的递归函数。

首先找到所有要更新的数据

<div class="bannar">
    <img class="slides" src="images/bannar1.jpg">
    <img class="slides" src="images/bannar2.jpg">
    <img class="slides" src="images/bannar3.jpg">
</div