2017-03-31 14 views
0

を置き換える私が書類を持っていると私は集約していると私は次のようにフィールドをサブにしたい場合:MongoDBのパイプライン集約パイプライン値

{data: {'date_created': '2011-01-01', 'title': 'abc'}, 'owner': 'Jim'} 
{data: {'date_created': '2011-05-01', 'title': 'def'}, 'owner': 'Bob'} 
{data: {'date_created': '2011-03-01', 'title': 'ghi'}, 'owner': 'Jim'} 
{data: {'date_created': '2011-03-01', 'title': ''}, 'owner': 'Sam'} 

と私は唯一の特定の日付より前に作成されたタイトルを取るように集約したいです空のリストを返すと、私はどのように集約パイプラインを構成しますか?

だから、所望の出力は次のようになります。

{owner: "Jim", titles: ["abc", "def"], 
owner: "Bob", titles: [], 
owner: "Sam", titles: []} 

私は同じようなものだ、集約パイプラインがあります。

lookup => unwind => 
     {'$match': 
      {'$or': [{'data.date_created': {'$lte': requested_date}}, {'data.title': {'$exists': False}}]}}} 

が、私は日付が作成したデータをキャストする方法を見つけ出すことはできませんがそれは空白のタイトルでグループ化されるので、空白に必要な時間の後です。

+1

あなたは$のpush'が吸収すると何も追加しません 'ダミーフィールド(非存在しないフィールド)を使用して、好きなら非標準は、あなたがそれを簡略化することができますが。 {$ {title} $ {title} $ {title} $ {title} $ {title} $ {title} $ {title} $ {title} "、" $ nonexist " ] } } } } – Veeram

答えて

1

この情報がお役に立てば幸いです。日付に基づいて条件付きプッシュを行い、titles配列から空白の項目を除外することができます。

db.collection.aggregate([ 
    {"$group":{ 
    _id:"$owner",titles:{ 
     $push: { $cond:[ 
     { $lte: [ "$data.date_created", "2011-03-01" ]},"$data.title","" 
      ] 
     } 
     } 
    } 
    }, 
    { 
    $project: { 
     _id:0, 
     owner : "$_id", 
     titles: { 
     $filter: { 
      input: "$titles", 
      as: "titles", 
      cond: { $ne: [ "$$titles", "" ] } 
     } 
     } 
    } 
    } 
]) 

結果:

{ "titles" : [ ], "owner" : "Bob" } 
{ "titles" : [ "abc", "ghi" ], "owner" : "Jim" } 
{ "titles" : [ ], "owner" : "Sam" } 
1

条件に一致する項目がない場合は、空の配列を厳密に要求していない場合は、はるかに簡単になります。その場合は、$match$group$pushまたは$addToSetのいずれかに設定するだけです。例えば

db.foo.aggregate([ 
    { $match : {'data.date_created': {'$lte': "2011-03-01"}}}, 
    { $group: { 
     _id: "$owner", 
     titles : {$push : "$data.title"} 
    }} 
]) 

結果:

{ "_id" : "Sam", "titles" : [ "" ] } 
{ "_id" : "Jim", "titles" : [ "abc", "ghi" ] } 

別のオプションは、$filterを使用して配列の要素をフィルタリングし、その後、あなたの$group/$push最初の操作を行うことであろうが(MongoDBのを3.2以上が必要です)。例えば

db.foo.aggregate([ 
    { $group: { 
     _id: "$owner", 
     data : {$push : "$data"} 
    }}, 
    { 
     $project: { 
     titles: { 
      $filter: { 
       input: "$data", 
       as: "item", 
       cond: { $lte: [ "$$item.date_created", "2011-03-01" ] } 
      } 
     } 
    }} 
]) 

結果:

{ "_id" : "Sam", "titles" : [ { "date_created" : "2011-03-01", "title" : "" } ] } 
{ "_id" : "Bob", "titles" : [ ] } 
{ "_id" : "Jim", "titles" : [ { "date_created" : "2011-01-01", "title" : "abc" }, { "date_created" : "2011-03-01", "title" : "ghi" } ] } 
関連する問題