2017-08-07 73 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