Javascript 如何使用聚合MongoDB获取数据Mongo数据
假设我们有10个集合,那么我们必须根据Javascript 如何使用聚合MongoDB获取数据Mongo数据,javascript,angularjs,node.js,mongodb,mongoose,Javascript,Angularjs,Node.js,Mongodb,Mongoose,假设我们有10个集合,那么我们必须根据tag\u id找到计数。例如,如果tag\u id包含0和1,那么我们必须计算所有数据,以及计算没有tag\u id的数据,或者tag\u id为空的数据。然后,如果它有未读:false,则输出来,计算所有未读的 查找tag_id的计数和false时未读的计数 { "_id": ObjectId("5912c7240520df77f0c2c18a"), "email_id": "54", "unread":
tag\u id
找到计数。例如,如果tag\u id
包含0和1,那么我们必须计算所有数据,以及计算没有tag\u id
的数据,或者tag\u id
为空的数据。然后,如果它有未读:false,则输出来,计算所有未读的
查找tag_id的计数和false时未读的计数
{
"_id": ObjectId("5912c7240520df77f0c2c18a"),
"email_id": "54",
"unread": "false",
"__v": NumberLong(0),
"tag_id": ["0"
]
}, {
"_id": ObjectId("5912c71e0520df77f0c2c189"),
"email_id": "55",
"unread": "false",
"__v": NumberLong(0),
"tag_id": [
"1"
]
}, {
"_id": ObjectId("5912c71d0520df77f0c2c186"),
"email_id": "51",
"unread": "false",
"__v": NumberLong(0),
"tag_id": [
"2", "1"
]
}
预期结果:
{
"data": [{
"tag_id": "1",
"count_email": 1,(count of email on the basis of tag_id)
"unread": 9(count the unread on the basis of output of tag_id)
}, {
"tag_id": "3",
"count_email": 45,
"unread": 3
}, {
"tag_id": "2",
"count_email": 5,
"unread": 4
}, {
"id": null,
"count_email": 52,
"unread": 35
}]
}
您可以使用下面的聚合管道 下面的查询将
$unwind
标记id,然后是$group
以计数电子邮件,然后是$cond
操作员以计数未读的电子邮件
db.collection.aggregate(
{$unwind:{path:"$tag_id", preserveNullAndEmptyArrays:true}},
{$group:{
_id:"$tag_id",
count_email:{$sum:1},
unread:{$sum:{$cond:[{$eq:["$unread", "false"]}, 0, 1]}}
}
}
);
这不清楚,预期输出与您提供的示例文档不一致。您能否更新预期的输出并添加有关您尝试实现的目标的详细信息?Mongo提供聚合、map reduce等。。。但实际上,这些操作在事务系统中无法扩展。如果是为了分析,那么有比mongo更适合的数据存储。谢谢。好啊谢谢它为我做的工作,我想再问一件事,如果我有tag_id“id”:null或没有tag_id,我想知道{“id”:null,“count_email”:52,“unread”:35}我们能在不使用$wind的情况下找到相同的输出吗,因为我使用的是mongo 3.0版本,我有很多项目使用版本3.0@Veeram,你可能不得不使用map reduce。我认为为3.0版创建单独的问题是值得的。你能告诉我如何使用3.0版吗?你也可以检查一下,我已经为此创建了一个单独的问题