Mongodb放松并匹配VS匹配和放松

时间:2017-08-07 08:31:03

标签: mongodb mongodb-query

我希望通过最小化要解除的记录数来优化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
        }
    ]
}

1 个答案:

答案 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}}}
])

...表明展开阶段适用于整个集合,而如果在展开之前匹配,则只展开匹配的文档。