Mongodb group by和使用Map求和并获取媒体
我的数据库中有以下集合: 项目:Mongodb group by和使用Map求和并获取媒体,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我的数据库中有以下集合: 项目: { "IdUser" : "1", "IdItem" : "1" }, { "IdUser" : "1", "IdItem" : "2" }, { "IdUser" : "1", "IdItem" : "3" }, { "IdUser" : "2", "IdItem" : "4" }, { "IdUser" : "2", "IdItem" : "5" }, { "IdUser" : "4", "IdItem" : "6" }, { "IdUser" : "5",
{ "IdUser" : "1", "IdItem" : "1" },
{ "IdUser" : "1", "IdItem" : "2" },
{ "IdUser" : "1", "IdItem" : "3" },
{ "IdUser" : "2", "IdItem" : "4" },
{ "IdUser" : "2", "IdItem" : "5" },
{ "IdUser" : "4", "IdItem" : "6" },
{ "IdUser" : "5", "IdItem" : "7" }
用户
{ "_id" : "1", "DateRegister" : ISODate("2016-03-29T22:00:38.764+0000") },
{ "_id" : "2", "DateRegister" : ISODate("2014-03-29T22:00:38.764+0000") },
{ "_id" : "2", "DateRegister" : ISODate("2015-02-29T22:00:38.764+0000") },
{ "_id" : "4", "DateRegister" : ISODate("2013-01-29T22:00:38.764+0000") },
{ "_id" : "5", "DateRegister" : ISODate("2016-04-29T22:00:38.764+0000") }
我如何获得此结果,但在2015年之后注册的用户进行过滤
具有一个项目的用户:2
有两项的用户:1
有三项的用户:1
我已经试过了,但我不知道如何过滤。。。谢谢
db.collection.aggregate([
{
"$group": {
"_id": "$IdUser",
"count": {
"$sum": { "$cond": [{ "$gt": [ "$IdItem", null ] }, 1, 0 ] }
}
}
},
{
"$group": {
"_id": "$count",
"users": { "$push": "$_id" }
}
},
{
"$project": {
"_id": 0,
"number_of_items": "$_id",
"number_of_users": { "$size": "$users" }
}
}
])
您可能希望利用操作符执行items集合与users集合的联接,然后在管道化主要分组操作之前对
DateRegistered
字段执行筛选
下面的示例+此处指向文档的链接将为您提供一个想法:
db.items.aggregate([
{
"$lookup": {
"from": "users",
"localField": "IdUser",
"foreignField": "_id",
"as": "user"
}
},
{ "$match": { "user.DateRegister": { "$gt": new Date(2015, 11, 31) } } },
{
"$group": {
"_id": "$IdUser",
"count": {
"$sum": { "$cond": [{ "$gt": [ "$IdItem", null ] }, 1, 0 ] }
}
}
},
{
"$group": {
"_id": "$count",
"users": { "$push": "$_id" }
}
},
{
"$project": {
"_id": 0,
"number_of_items": "$_id",
"number_of_users": { "$size": "$users" }
}
}
])
如果您的MongoDB服务器不支持操作符,那么您将需要一个解决方案,在不同集合上拆分操作,即
- 获取与给定日期范围条件匹配的用户id列表,这可以通过用户集合上带有日期查询选项的方法完成
- 在操作符初始步骤中的项目集合聚合管道中使用该列表李>
// use distinct to get the user id's list
var userIds = db.users.distinct("_id", { "DateRegister": { "$gt": new Date(2015, 11, 31) } })
// perform your aggregation with a filtered collection using the list from the above operations
db.items.aggregate([
{ "$match": { "IdUser": { "$in": userIds } } },
{
"$group": {
"_id": "$IdUser",
"count": {
"$sum": { "$cond": [{ "$gt": [ "$IdItem", null ] }, 1, 0 ] }
}
}
},
{
"$group": {
"_id": "$count",
"users": { "$push": "$_id" }
}
},
{
"$project": {
"_id": 0,
"number_of_items": "$_id",
"number_of_users": { "$size": "$users" }
}
}
])
非常感谢;)它很好用。。。一条评论,想象IdUser是一个ObjectId是集合用户和Items集合中的一个字符串,我如何解析它?对我来说似乎有点违反直觉;为什么要将ID保存为items集合中的字符串,而不是将引用保存为
ObjectId
s?无论如何,要解析字符串,您需要在执行解析的$lookup
管道之前执行一个额外的$project
操作符步骤:遵循以下指导。