首页 文章

MongoDB组查询嵌入文档

提问于
浏览
0

我有一个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")
}

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

  • 查找特定用户ID的文档

  • 展开嵌入式数组

  • 使用_id对文档进行分组 -

  • 对嵌入数组的items.value求和

  • 获取嵌入数组的items.dateTime的最小值

Note . sum和min,我想得到一个对象,即项目数组中{item:sum,dateTime:min of items.dateTime}

可以使用push或其他技术在单个聚合调用中实现这一点 .

2 回答

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

相关问题