MongoDB Group查询嵌入式文档

时间:2014-12-09 05:05:19

标签: mongodb mongodb-query

我有一个mongo文档,其结构类似于

{
"_id" : "THIS_IS_A_DHP_USER_ID+2014-11-26",
"_class" : "weight",
"items" : [
    {
        "dateTime" : ISODate("2014-11-26T08:08:38.716Z"),
        "value" : 98.5
    },
    {
        "dateTime" : ISODate("2014-11-26T08:18:38.716Z"),
        "value" : 95.5
    },
    {
        "dateTime" : ISODate("2014-11-26T08:28:38.663Z"),
        "value" : 90.5
    }
],
"source" : "MANUAL",
"to" : ISODate("2014-11-26T08:08:38.716Z"),
"from" : ISODate("2014-11-26T08:08:38.716Z"),
"userId" : "THIS_IS_A_DHP_USER_ID",
"createdDate" : ISODate("2014-11-26T08:38:38.776Z")
}
{
"_id" : "THIS_IS_A_DHP_USER_ID+2014-11-25",
"_class" : "weight",
"items" : [
    {
        "dateTime" : ISODate("2014-11-25T08:08:38.716Z"),
        "value" : 198.5
    },
    {
        "dateTime" : ISODate("2014-11-25T08:18:38.716Z"),
        "value" : 195.5
    },
    {
        "dateTime" : ISODate("2014-11-25T08:28:38.716Z"),
        "value" : 190.5
    }
],
"source" : "MANUAL",
"to" : ISODate("2014-11-25T08:08:38.716Z"),
"from" : ISODate("2014-11-25T08:08:38.716Z"),
"userId" : "THIS_IS_A_DHP_USER_ID",
"createdDate" : ISODate("2014-11-26T08:38:38.893Z")
}

要在此文档结构上触发的查询

  1. 查找特定用户ID的文档
  2. 展开嵌入式数组
  3. 使用_id对文档进行分组 -
    1. 汇总嵌入数组的items.value
    2. 获取嵌入式数组的items.dateTime的最小值
  4. 注意即可。 sum和min,我希望得到一个对象,即项目数组中{item:sum,dateTime:min of items.dateTime}

    这可以通过push或其他技术在单个聚合调用中实现。

2 个答案:

答案 0 :(得分:1)

当您对特定_id进行分组并应用$min$sum等聚合运算符时,每个组只存在一条记录(_id),该组的总和和最短日期。因此,无法为同一sum获取不同的minimum和不同的_id日期,这在逻辑上也毫无意义。

您想要做的是:

db.collection.aggregate([
{$match:{"userId":"THIS_IS_A_DHP_USER_ID"}},
{$unwind:"$items"},
{$group:{"_id":"$_id",
         "values":{$sum:"$items.value"},
         "dateTime":{$min:"$items.dateTime"}}}
])

但是,如果您不查询特定的userId,那么您将拥有多个群组,每个群组都有自己的summin日期。然后使用$push运算符将所有这些结果累积在一个数组中是有意义的。

db.collection.aggregate([
{$unwind:"$items"},
{$group:{"_id":"$_id",
         "result":{$sum:"$items.value"},
         "dateTime":{$min:"$items.dateTime"}}},
{$group:{"_id":null,"result":{$push:{"value":"$result",
                                     "dateTime":"$dateTime",
                                     "id":"$_id"}}}},
{$project:{"_id":0,"result":1}}
])

答案 1 :(得分:0)

你应该使用以下聚合可能有效

db.collectionName.aggregate(
                           {"$unwind":"$items"},
                           {"$match":{"userId":"THIS_IS_A_DHP_USER_ID"}},
                          {"$group":{"_id":"$_id","sum":{"$sum":"$items.value"},
                          "minDate":{"$min":"$items.dateTime"}}}
                           )