Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb group by和使用Map求和并获取媒体_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

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
操作符步骤:遵循以下指导。