我有一个有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 } } } })
哪种更有效?
答案 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中的数组索引对于如此庞大的数组效率非常低。