2016-12-19 3 views
0

{ 
    "_id": 1, 
    "people": [ 
    {"id": 1, "name": "foo"}, 
    {"id": 2, "name": "bar"}, 
    /.../ 
    ], 
    "stats": [ 
    {"peopleId": 1, "workHours": 24}, 
    {"peopleId": 2, "workHours": 36}, 
    /.../ 
} 

私のコレクション内の各要素は、それぞれの週、私の会社では、社員一人ひとりの仕事を表しています。重要なお知らせとして、peopleIdが1週間から別の週に変更される場合があります。

fooが24時間以上働いた週をすべて取得したいと思います。ご覧のとおり、私のデータベースでは人名と勤務時間が分かれているので、フォーマットはちょっと面倒です。単純な$andでは不十分です。

$$elemMatch私はこのクエリを行うことができますか? これを使用して、「人」エンティティを「統計」エンティティでグループ化できますか?

+0

私はオブジェクトによってフィルタリングするために '$ in'を使用することはできません見たので、私はそれが可能であるいくつかの疑問を持っている:/ – FunkySayu

+0

は、私はあなたが[$検索](HTTPSが必要かもしれないと思う:// WWW。 mongodb.com/blog/post/joins-and-other-aggregation-enhancements-coming-in-mongodb-3-2-part-1-of-3-introduction)。これは集約パイプライン中に「結合」を提供することができます。 – user3094755

答えて

2

fooを取得するクエリは24時間以上働いた。コレクション内の

db.collection.aggregate([ 
{$unwind: { path : "$people"}}, 
{$unwind: { path : "$stats"}}, 
{$match: { "people.name" : "foo"}}, 
{$group: { 
      _id: "$_id", 
      peopleIdMoreThan24: { $addToSet: { 
       $cond : { if : { $and : [ {"$eq" : ["$people.id", "$stats.peopleId" ] }, 
         {"$gt" : ["$stats.workHours", 24] }]} , then : "$people.id", else: "Not satisfying the condition"}}}    
     } 
}, 
{$unwind: { path : "$peopleIdMoreThan24" }}, 
{$match: { "peopleIdMoreThan24" : {$nin : [ "Not satisfying the condition"]}}}, 
]); 

データ: -

/* 1 */ 
{ 
    "_id" : 1, 
    "people" : [ 
     { 
      "id" : 1, 
      "name" : "foo" 
     }, 
     { 
      "id" : 2, 
      "name" : "bar" 
     } 
    ], 
    "stats" : [ 
     { 
      "peopleId" : 1, 
      "workHours" : 24 
     }, 
     { 
      "peopleId" : 2, 
      "workHours" : 36 
     } 
    ] 
} 

/* 2 */ 
{ 
    "_id" : 2, 
    "people" : [ 
     { 
      "id" : 1, 
      "name" : "foo" 
     }, 
     { 
      "id" : 2, 
      "name" : "bar" 
     } 
    ], 
    "stats" : [ 
     { 
      "peopleId" : 1, 
      "workHours" : 25 
     }, 
     { 
      "peopleId" : 2, 
      "workHours" : 36 
     } 
    ] 
} 

/* 3 */ 
{ 
    "_id" : 3, 
    "people" : [ 
     { 
      "id" : 1, 
      "name" : "foo" 
     }, 
     { 
      "id" : 2, 
      "name" : "bar" 
     } 
    ], 
    "stats" : [ 
     { 
      "peopleId" : 1, 
      "workHours" : 25 
     }, 
     { 
      "peopleId" : 2, 
      "workHours" : 36 
     } 
    ] 
} 

出力: -

出力は、文書IDとfooの人々IDが24時間以上働いています。

/* 1 */ 
{ 
    "_id" : 3, 
    "peopleIdMoreThan24" : 1 
} 

/* 2 */ 
{ 
    "_id" : 2, 
    "peopleIdMoreThan24" : 1 
} 
関連する問題