2013-05-14 4 views
22

集計関数内で使用される$match演算子とMongodbの正規findの違いは何ですか?

find関数で集計関数のようにフィールド名の名前を変更できないのはなぜですか?例: 集計では、次の文字列を渡すことができます。

{ "$project" : { "OrderNumber" : "$PurchaseOrder.OrderNumber" , "ShipDate" : "$PurchaseOrder.ShipDate"}} 

ただし、findはこれを許可しません。

集計出力がDBCursorまたはリストとして返されないのはなぜですか?また返されるドキュメントの数を取得できないのはなぜですか?

ありがとうございます。

+0

VS [MS] [MongoDBの2.6凝集操作は、カーソルが返される(http://docs.mongodb.org/master/release-notes/2.6 /#aggregation-operations-now-return-cursors)を使用します。 – vinipsmaker

答えて

28

集計出力がDBCursorまたはリストとして返されないのはなぜですか?

アグリゲーションフレームワークは、map-reduceが必要な簡単な問題を解決するために作成されました。

このフレームワークは、入力としてフルdbを、出力として少数のドキュメントを必要とするデータを計算するためによく使用されます。

集計関数内で使用される$ match演算子とMongodbの通常検索との違いは何ですか?

あなたが述べたように、戻り値の型が異なります。オペレーションの出力を返します。DBCursorです。

その他の違い:

  • は、集計結果はunder 16MBでなければなりません。 shardsを使用している場合は、最初の$groupまたは$sortの後に完全なデータmust be collected in a single pointを入力します。
  • $ match集約のパワーを向上させることのみが目的ですが、集計のパフォーマンスを向上させるなど、いくつかの用途があります。

また、返されるドキュメントの数を取得できないのはなぜですか?

できます。ただ、結果の配列の要素数を数えたり、パイプの最後に次のコマンドを追加します。

{$group: {_id: null, count: {$sum: 1}}} 

なぜfind関数は集約関数のようなフィールド名の名前を変更することはできませんか?

MongoDBはまだ若く、機能はまだ登場しています。おそらく、将来のバージョンではそれを実現できるでしょう。 アグリゲーションでは、フィールドの名前を変更することは、よりも、よりも重要です。

EDIT(2014年2月26日):

MongoDB 2.6 aggregation operations will return a cursor

EDIT(2014年4月9日):

MongoDB 2.6 was released with the predicted aggregation changes

+0

更新:mongo 3.4では、 '{$ count:" number_of_elements "}'によって集計することができます – Daniel

0

集計についていくつか調査したところ、電話番号は でした。これを160k文書の表の降順ソートで行い、いくつかの文書に出力を制限しました。

  1. 集約コマンドは、findコマンドよりも低速です。
  2. ToList()のようなデータにアクセスすると、集約コマンドは検索よりも高速です。
  3. あなたは合計回(ポイント1 + 2)で見た場合のコマンドは多分凝集が自動的ToList()を呼び出し、それを再度呼び出す必要はありません

等しくなるように思われます。後でToList()に電話をかけないと、find()コールがはるかに高速になります。

7 50 [ミリ秒](5つの文書)