MongoDB:多个字段上的单个更新V / S单个字段上的多个更新?

时间:2016-10-12 11:03:32

标签: arrays mongodb updates

我有一个有7个数组的集合,每个数组包含1000多个子文档 即

{  
    "_id": 1,
    "arr1": [
        { "date": 20100101, "time": 120000, "key": "value1" },
        { "date": 20100401, "time": 121500, "key": "value2" },
        ...
        { "date": 20161001, "time": 120000, "key": "valueN" },
    ],
    .
    .
    "arr7": [
        { "date": 20100101, "time": 120000, "key": "value1" },
        { "date": 20100401, "time": 121500, "key": "value2" },
        ...
        { "date": 20161001, "time": 120000, "key": "valueN" },
    ]
}

我想从所有数组中提取比特定日期更早的活动。 我应该执行一次更新,它会立即从每个数组中提取匹配的子文档,即

db.collection.updateMany({}, { $pull: { arr1: { date: { $lt: 151031 } }, arr2: { date: { $lt: 151031 } }, ... arr7: { date: { $lt: 151031 } } } })

或者我应该为每个阵列单独执行更新。即

db.collection.updateMany({}, { $pull: { arr1: { date: { $lt: 20160101 } } } })
db.collection.updateMany({}, { $pull: { arr2: { date: { $lt: 20160101 } } } })
...
db.collection.updateMany({}, { $pull: { arr7: { date: { $lt: 20160101 } } } })

哪种更有效?

1 个答案:

答案 0 :(得分:1)

我会说你应该使用一个查询来从所有数组中提取

db.collection.updateMany({}, { $pull: { arr1: { date: { $lt: 151031 } }, arr2: { date: { $lt: 151031 } }, ... arr7: { date: { $lt: 151031 } } } })

这使mongo查询优化器可以完全控制执行。例如,它可能只需要访问每个对象一次而不是七次。

您应该使用explain()查看查询的确切执行情况(请参阅https://docs.mongodb.com/v3.2/reference/method/cursor.explain/)。

您也可能需要考虑更改数据模型,因为您可能会遇到mongo每个文档限制16MB的问题。此外,mongo中的数组索引对于如此庞大的数组效率非常低。

相关问题