我希望通过最小化要解除的记录数来优化MongoDB性能。
我喜欢:
unwind(injectionRecords),
match("machineID" : "machine1"),
count(counter)
但由于大量数据,展开操作需要花费大量时间,然后才能从展开中进行匹配。 它展开所有4条记录然后匹配结果中的machineID并给我数数。
相反,我想做类似的事情:
match("machineID": "machine1"),
unwind(injectionRecords)
count(counter)
所以,它会匹配具有machineID的记录并且只展开2而不是4,并给我计算它。
这可能吗?我怎么能这样做?
以下是示例文档,
{
"_id" : ObjectId("5981c24b90a7c215e4f166dd"),
"machineID" : "machine1",
"injectionRecords" : [
{
"startTime" : ISODate("2017-08-02T17:45:04.779+05:30"),
"endTime" : ISODate("2017-08-02T17:45:07.763+05:30"),
"counter" : 1
},
{
"startTime" : ISODate("2017-08-02T17:45:24.417+05:30"),
"endTime" : ISODate("2017-08-02T17:45:27.402+05:30"),
"counter" : 2
}
]
},
{
"_id" : ObjectId("5981c24b90a7c215e4f166de"),
"machineID" : "machine2",
"injectionRecords" : [
{
"startTime" : ISODate("2017-08-02T17:46:04.779+05:30"),
"endTime" : ISODate("2017-08-02T17:46:07.763+05:30"),
"counter" : 1
},
{
"startTime" : ISODate("2017-08-02T17:46:24.417+05:30"),
"endTime" : ISODate("2017-08-02T17:46:27.402+05:30"),
"counter" : 2
}
]
}
答案 0 :(得分:0)
以下查询将返回给定injectionRecords
的{{1}}计数。我认为这就是你要求的。
machineId
当然,这个查询(在比赛之前进行展开)在功能上是等价的:
db.collection.aggregate([
{$match: {machineID: 'machine1'}},
{$unwind: '$injectionRecords'},
{$group:{_id: "$_id",count:{$sum:1}}}
])
但是,使用explain ...
运行该查询db.collection.aggregate([
{$unwind: '$injectionRecords'},
{$match: {machineID: 'machine1'}},
{$group:{_id: "$_id",count:{$sum:1}}}
])
...表明展开阶段适用于整个集合,而如果在展开之前匹配,则只展开匹配的文档。