2017-08-07 71 views
0

我期望通过最小化要放松的记录数来优化MongoDB性能。Mongodb展开和匹配VS匹配和解开

我不喜欢:

unwind(injectionRecords), 
match("machineID" : "machine1"), 
count(counter) 

,因为庞大的数据,但放松操作需要花费大量的时间,然后从开卷相匹配。 它展开所有4条记录,然后从结果中匹配machineID,并给我数。

相反,我想这样做:

match("machineID": "machine1"), 
unwind(injectionRecords) 
count(counter) 

因此,它会匹配具有设备ID记录和放松的只有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

当然,可以通过(1)匹配然后(2)展开来订购聚合管道,因此对于您的问题的答案可能取决于您的特定匹配**是否实际适用于解开数据之前的数据。你可以更新你的问题,包括一个示例文档和你目前的放松和比赛阶段? – glytching

+0

@ glitch可以发布优化查询我的问题? – Pratikmr97

+0

@RicardoRocha请勿将代码格式设置为像'mongodb'这样的单词。 [更多信息请看这里](https://meta.stackoverflow.com/a/254995/4244993) – jmattheis

回答

0

下面的查询将返回injectionRecords计数对于给定machineId。我认为这是你所要求的。

db.collection.aggregate([ 
    {$match: {machineID: 'machine1'}}, 
    {$unwind: '$injectionRecords'}, 
    {$group:{_id: "$_id",count:{$sum:1}}} 
]) 

当然,这个查询(其中回卷发生在比赛前)在功能上等同:

db.collection.aggregate([ 
    {$unwind: '$injectionRecords'}, 
    {$match: {machineID: 'machine1'}}, 
    {$group:{_id: "$_id",count:{$sum:1}}} 
]) 

但是,运行与解释,查询......

db.collection.aggregate([ 
    {$unwind: '$injectionRecords'}, 
    {$match: {machineID: 'machine1'}}, 
    {$group:{_id: "$_id",count:{$sum:1}}} 
], {explain: true}) 

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

+0

非常感谢@ glitch。我对查询执行的阶段不太确定,但'{explain:true}'有很多帮助。 – Pratikmr97