我有一个包含7个数组的集合,每个数组包含1000多个子文档。
IE
{
"_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 } } } })
还是我应该为每个数组分别执行更新。IE
db.collection.updateMany({}, { $pull: { arr1: { date: { $lt: 20160101 } } } })
db.collection.updateMany({}, { $pull: { arr2: { date: { $lt: 20160101 } } } })
...
db.collection.updateMany({}, { $pull: { arr7: { date: { $lt: 20160101 } } } })
哪个会更有效?
我会说你应该使用一个查询从所有数组中提取
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中的数组索引对于如此庞大的数组来说效率很低。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句