2017-08-07 7 views
0

アンワインドするレコードの数を最小限に抑えることで、MongoDBのパフォーマンスを最適化したいと考えています。MongodbはリバインドしてVSのマッチとアンワインドを行います。

私は好きです。

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

しかし、理由は膨大なデータの操作は多くの時間がかかり、それがアンワインドから一致しておくつろぎください。 これは、4つのレコードすべてを解き、machineIDとresultをマッチさせます。

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

だから、それはmachineIDを持つレコードを照合し、唯一の2の代わりに4のをほどくと、私にそれの数を与える:

代わりに、私のような何かをしたいと思います。

これは可能ですか?これどうやってするの?ここで

は、次のクエリが与えられたmachineIdためinjectionRecordsの数を返します

{ 
    "_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

、サンプルのドキュメントです。私はだと思います。これはあなたが求めているものです。もちろん

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

ありがとうalot @glitch。私はクエリ実行の段階についてはあまりよく分かっていませんでしたが、 '{explain:true}'は多くの助けになりました。 – Pratikmr97

関連する問題