使用$和$ elemMatch对实体进行分组

时间:2016-12-19 16:56:45

标签: mongodb mongodb-query

考虑我的mongo数据库实例中的以下文档:

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

我的收藏中的每个元素代表我公司每个员工的工作,每周一次。重要提示,peopleId可能会从一周变为另一周!

我希望foo工作超过24小时的所有周。正如您所看到的,格式有点烦人,因为人名和工作时间在我的数据库中是分开的。简单的$and是不够的。

我想知道,使用一些$$elemMatch我是否可以实现此查询。 我可以使用它来将“人”实体与“统计”实体分组吗?

1 个答案:

答案 0 :(得分: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,人员ID foo的工作时间超过24小时。

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

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