2016-09-06 1 views
1

https://docs.mongodb.com/manual/reference/operator/aggregation/gte/

がありますが、上記のmongo DBのドキュメントで見ることができるように、$ GTEがあまりにも偽のデータを返します。

例JSONデータ:

db.inventory.aggregate(
    [ 
    { 
     $project: 
      { 
      item: 1, 
      qty: 1, 
      qtyGte250: { $gte: [ "$qty", 250 ] }, 
      _id: 0 
      } 
    } 
    ] 
) 

出力:

{ "item" : "abc1", "qty" : 300, "qtyGte250" : true } 
{ "item" : "abc2", "qty" : 200, "qtyGte250" : false } 
{ "item" : "xyz1", "qty" : 250, "qtyGte250" : true } 
{ "item" : "VWZ1", "qty" : 300, "qtyGte250" : true } 
{ "item" : "VWZ2", "qty" : 180, "qtyGte250" : false } 

問題: まあ私数量が250よりも大きいデータを取得するための

{ "_id" : 1, "item" : "abc1", description: "product 1", qty: 300 } 
{ "_id" : 2, "item" : "abc2", description: "product 2", qty: 200 } 
{ "_id" : 3, "item" : "xyz1", description: "product 3", qty: 250 } 
{ "_id" : 4, "item" : "VWZ1", description: "product 4", qty: 300 } 
{ "_id" : 5, "item" : "VWZ2", description: "product 5", qty: 180 } 

クエリQty> 250のmongo dbが表示されているデータが必要ですすべてのデータが含まれているため、レコードの数が非常に多い場合、サイトは非常に遅くなります。

私はmongoidを持つレールにrubyを使用しています。私はgroup by節を使用する必要があるため、集計する必要がありますが、これはすべてのデータを返します。 私の元のクエリ:

data = SomeModel.collection.aggregate([ 
     {"$project" => { 
     "dayOfMonth" => {"$dayOfMonth" => "$created_time"}, 
     "month" => {"$month" => "$created_time"}, 
     "year" => {"$year" => "$created_time"}, 
     "date_check_gte" => {"$gte" => ["$created_time",start_time]}, 
     "date_check_lte" => {"$lte" => ["$created_time",end_time]}, 
     }}, 
     {"$group" => { 
     "_id" => { "dayOfMonth" => "$dayOfMonth", "month" => "$month", "year" => "$year"}, 
     "Total" => {"$sum" => 1}, 
     "check_one" => {"$first" => "$date_check_gte"}, 
     "check_two" => {"$first" => "$date_check_lte"} 
     }}, 
     {"$sort" => { 
     "Total" => 1 
     }} 
    ]) 

完全グループが、GTEとLTEの使用にもかかわらず、すべてのデータを返します。 偽のデータが表示されないようにできることはありますか?

答えて

2

数量が250よりも大きいデータを取得するための「クエリ」は、指定された条件(複数可)と一致する文書のみを渡すために文書をフィルタリング$matchパイプライン演算子を必要とします

db.inventory.aggregate([ 
    { "$match": { "qty": { "$gte": 250 } } } 
) 

やそれを用いた:次のパイプラインステージではなく、あなたが現在行っているよう$projectパイプラインへ$projectパイプライン(上記のよう$matchちょうど単一のパイプラインを使用しているので必要ないがで十分であろう):

db.inventory.aggregate([ 
    { 
     "$project": { 
      "item": 1, 
      "qty": 1, 
      "qtyGte250": { "$gte": [ "$qty", 250 ] }, 
      "_id": 0 
     } 
    }, 
    { "$match": { "qtyGte250": true } } 
]) 
2

パイプラインで$matchを使用して、qty > 250

例:

db.inventory.aggregate(
    [ {$match: {qty: {$gt: 250}}}, 
    { 
     $project: 
      { 
      item: 1, 
      qty: 1, 
      _id: 0 
      } 
    } 
    ] 
) 
関連する問題