MongoDB按对象键聚合数组的总和数组
好吧,我已经搜索了一段时间,但找不到答案,我绝望了:p 我有一些使用这种语法的文档MongoDB按对象键聚合数组的总和数组,mongodb,Mongodb,好吧,我已经搜索了一段时间,但找不到答案,我绝望了:p 我有一些使用这种语法的文档 { "period": ISODate("2018-05-29T22:00:00.000+0000"), "totalHits": 13982 "hits": [ { // some fields... users: [ { // some fields
{
"period": ISODate("2018-05-29T22:00:00.000+0000"),
"totalHits": 13982
"hits": [
{
// some fields...
users: [
{
// some fields...
userId: 1,
products: [
{ productId: 1, price: 30 },
{ productId: 2, price: 30 },
{ productId: 3, price: 30 },
{ productId: 4, price: 30 },
]
},
]
}
]
}
我想获取一个计数,计算一段时间内我们有多少产品,与哪个用户的产品无关,一个示例输出如下:
[
{
"period": ISODate("2018-05-27T22:00:00.000+0000"),
"count": 432
},
{
"period": ISODate("2018-05-28T22:00:00.000+0000"),
"count": 442
},
{
"period": ISODate("2018-05-29T22:00:00.000+0000"),
"count": 519
}
]
让我抓狂的是数组中的对象数组中的对象我做了很多聚合,但我认为它们比这个简单,所以我有点迷茫
我正在考虑将我们的文档结构更改为更好的文档结构,但我们有大约600万个文档需要转换为新的文档,这简直是一团糟。。。但也许这是唯一的解决办法
我们使用的是MongoDB 3.2,我们无法更新我们的系统,但这是不可能的。您可以使用$unwind扩展阵列,然后使用$group求和:
如果您想要每个用户id,那么除了$unwind每个数组(无论版本如何)之外,没有其他选项。更新的版本在这里对您没有任何帮助,而问题似乎更多的是嵌套数组,您应该有一个更平坦的结构。我已经读过“展开”对于大型集合不是最佳选择,无论如何,它需要超低的计数,我需要检查结果,但它给我的结果比我尝试过的聚合更好,一旦我们测试了东西,我会给你我的反馈,但看起来很有希望:D我会把这个aggr刻在我的大脑上看起来它是对所有产品的总和,而不仅仅是那些与ID匹配的产品,例如在我们的旧数据中,我们对一个产品的计数是180,通过这个查询,我得到了8641,这是非常巨大的,看起来像每个产品的总和,因为我们的库存等。我尝试了$filter,但我不是很好,所以什么也没做:P sum总是0你必须把你的过滤器放在这里{$match:{},并根据你的需要定制。如果您想要特定的产品,请在每个投影后放置一个$match。是的,我将我的过滤器放置在该匹配中,{hits.users.products.productId:1}我认为$sum$大小是个问题,因为products数组的大小不仅包含一个产品,还包含一组产品,我认为如果文档中包含该产品,它会计算数组的大小,而不是在每次精确的产品内部命中时计算+1。我想,我现在要走了,明天早上我会再次检查^^
db.test.aggregate([
{$match: {}},
{$unwind: "$hits"},
{$project: {_id: "$_id", period: "$period", users: "$hits.users"}},
{$unwind: "$users"},
{$project: {_id: "$_id", period: "$period", subCout: {$size: "$users.products"}}},
{$group: {"_id": "$period", "count": {$sum: "$count"}}}
])