我有一个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 回答
当您对特定的
_id
进行分组并应用聚合运算符(例如$min
和$sum
)时,每个组(_id
)只存在一条记录,该记录包含该组的总和和最小日期 . 所以没有办法为同一个_id
获得不同的sum
和不同的minimum
日期,这在逻辑上也没有意义 .你想要做的是:
但是,如果您不查询特定的
userId
,那么您将拥有多个组,每个组都有自己的sum
和min
日期 . 然后使用$push
运算符将所有这些结果累积在一个数组中是有意义的 .你应该使用以下聚合可能它的工作原理