MongoDB $匹配不适用于子文档的一部分

时间:2015-04-06 12:29:25

标签: mongodb mongodb-query

在我的 MongoDB 中,我正在尝试" 分组"使用 aggregate()函数和我使用的 $ match 查询的一组记录不会选择管道中的记录。

我的数据集有子文档(我在其上应用$ match),它看起来像这样:

{
    "_id" : ObjectId("550994e21cba9597624195aa"),
    "taskName" : "task name",
    "taskDetail" : "task detail.",
    "scheduledStartDate" : ISODate("2015-04-06T09:00:00.000Z"),
    "scheduledEndDate" : ISODate("2015-04-06T11:00:00.000Z"),
    "user" : {
        "id" : "abcd1123",
        "name" : "username"
    },
    "status" : "Assigned"
}
{
    "_id" : ObjectId("550994e21cba9597624195aa"),
    "taskName" : "task name",
    "taskDetail" : "task detail.",
    "scheduledStartDate" : ISODate("2015-04-06T09:00:00.000Z"),
    "scheduledEndDate" : ISODate("2015-04-06T11:00:00.000Z"),
    "user" : {
        "id" : "abcd1123",
        "name" : "username"
    },
    "status" : "Assigned"
}
{
    "_id" : ObjectId("550994e21cba9597624195aa"),
    "taskName" : "task name",
    "taskDetail" : "task detail.",
    "scheduledStartDate" : ISODate("2015-04-06T09:00:00.000Z"),
    "scheduledEndDate" : ISODate("2015-04-06T11:00:00.000Z"),
    "user" : {
        "id" : "abcd1124",
        "name" : "username"
    },
    "status" : "Assigned"
}

我想查找按状态类型分组的特定用户的状态计数。对于用户" abcd1123",我使用的查询是:

db.tasks.aggregate( [
   {
       $match : {
           user : { id : "abcd1123" } 
       }
   },
   {
       $group: {
          _id: "$status",
          count: { $sum: 1 }
       }
   }
] )

上述查询不会返回任何结果,因为 $ match 不会将任何结果输入管道。如果我像这样修改查询:

db.tasks.aggregate( [
   {
       $match : {
           user : { id : "abcd1123", name : "username" } 
       }
   },
   {
       $group: {
          _id: "$status",
          count: { $sum: 1 }
       }
   }
] )

它有效。但我没有用户名作为输入,我只需要根据用户ID找到。

由于用户不是数组,我无法使用 $ unwind

我如何实现这一目标?

1 个答案:

答案 0 :(得分:2)

您太近了,只能更改您的聚合查询,如下所示

db.collectionName.aggregate({
    "$match": {
    "user.id": "abcd1123"
    }
},
{
    "$group": {
    "_id": "$status",
    "count": {
        "$sum": 1
    }
    }
})