1

我在我的 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”显式使用文档。这种方法有效,但速度很慢。如果我的收藏很小,我相信这无关紧要,但因为它很大(数以百万计的文档)。它可能很慢,因为每次我添加一组字段时都必须移动整个文档。考虑到这一点,我尝试一次性将新字段添加到所有嵌入的文档中。我通过将查找查询留空并从“$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:......

有没有人能够对我做错了什么提供一些见解?甚至有可能做到这一点吗?

4

1 回答 1

1

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

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

db.collection('game_users').find(
    {"date": dates[i],"strategyId": strategyInfo[siOffset[l]][ID]}
).toArray(function(err, data) {
    var i=0;
    function data_Update(){
        if(i!=data.length){
            db.collection('game_users').update(
                {"date": dates[i],"strategyId": strategyInfo[siOffset[l]][ID]},
                { $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
                    }
                },
                function(err, resp) {
                    i++;
                    data_Update();
                }
            );
        }
    }
}
);`
于 2016-10-25T10:46:48.173 回答