【问题标题】:MongoDB Group querying for Embeded DocumentMongoDB 组查询嵌入式文档
【发布时间】:2015-02-06 22:08:52
【问题描述】:

我有一个结构类似的 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 的最小值

注意。总和和最小值,我想作为一个对象得到,即 { value : sum , dateTime : min of the items.dateTime} 在一个项目数组中

这是否可以使用推送或其他技术在单个聚合调用中实现。

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    当您对特定的 _id 进行分组并应用聚合运算符(例如 $min$sum)时,每个组仅存在一条记录 (_id),其中包含总和和最小日期团体。所以没有办法为同一个_id获取不同的sum和不同的minimum日期,这在逻辑上也是没有意义的。

    你想做的是:

    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}}
    ])
    

    【讨论】:

      【解决方案2】:

      你应该使用以下聚合可能会起作用

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

      【讨论】:

        猜你喜欢
        • 2021-08-07
        • 1970-01-01
        • 2021-03-24
        • 2021-04-14
        • 1970-01-01
        • 1970-01-01
        • 2015-08-30
        • 2011-04-26
        • 2018-03-20
        相关资源
        最近更新 更多