0

すべてのデータを集めるのに約30秒かかると集約関数の実行速度が非常に遅いという問題に直面しています。この構造では、レコードの1を仮定しますMongoDBの遅い集約時間

{ 
    "_id":{ 
     "$oid":"5909a5cefece40f172895a6b" 
    }, 
    "Record":1, 
    "Link":"https://www.google.com", 
    "Location":["loc1", "loc2", "loc3"], 
    "Organization":["org1", "org2", "org3"], 
    "Date":2017, 
    "PeoplePPL":["ppl1", "ppl2", "ppl3"] 
} 

および集計クエリを次のように

db.testdata_4.aggregate([{ 
    "$unwind": "$PeoplePPL" 
},{ 
    "$unwind": "$Location" 
},{ 
    "$match": { 
     Date: { 
      $gte: lowerBoundYear, 
      $lte: upperBoundYear 
     } 
    } 
},{ 
    "$group": { 
     "_id": { 
      "People": "$PeoplePPL", 
      "Date": "$Date" 
     }, 
     Links: { 
      $addToSet: "$Link" 
     }, 
     Locations: { 
      $addToSet: "$Location" 
     } 
    } 
},{ 
    "$group": { 
     "_id": "$_id.People", 
     Record: { 
      $push: { 
       "Country": "$Locations", 
       "Year": "$_id.Date", 
       "Links": "$Links" 
      } 
     } 
    } 
}]).toArray() 

154のレコードの合計が「testdata_4」コレクションであり、かつ集約すると、そこに意志を2871の照会時間で5571レコードが戻されます。私は "Locations"と "Date"にensureIndex()を実行しました。返されるレコードの数が増えると、これは正常であると思われますか?それが正常でない場合は、クエリ時間を28秒以上にするのではなく、最大で5秒に短縮するための回避策があるかどうかを知ることができますか?ありがとうございました!どのような解決策が提供されているのが最も感謝です!

答えて

0

Dateのインデックスが使用されていない可能性があります。

$match$sortオペレータは、インデックスを使用するときにインデックスを利用できます。at the beginning of the pipeline。この場合、フィルターはいくつかの$ unwind段階の後に適用されます。これはおそらく使用されないことを意味します。

提案:

  1. 移動パイプライン
  2. 「場所」、「日付」との先頭に$マッチ段階、それはすぐにではないので、「リンク」フィールドは、配列ではありませんこれらのフィールドに$ unwind集約ステージがある理由を明確にしてください。これらを削除することができます。