Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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聚合内部子集合上的组,并获取包含计数的完整文档_Mongodb_Mongodb Query_Aggregation Framework_Mongodb .net Driver - Fatal编程技术网

MongoDB聚合内部子集合上的组,并获取包含计数的完整文档

MongoDB聚合内部子集合上的组,并获取包含计数的完整文档,mongodb,mongodb-query,aggregation-framework,mongodb-.net-driver,Mongodb,Mongodb Query,Aggregation Framework,Mongodb .net Driver,我有一个用户集合,它还有一个“UserSubscription”集合,还有一个“Subscription>Publication” Mongo系列看起来像这样 /* 1 */ { "_id" : 1, "UserSubscriptions" : [ { "_id" : 1, "Subscription" : { "_id" : 1, "Publication" : {

我有一个用户集合,它还有一个“UserSubscription”集合,还有一个“Subscription>Publication”

Mongo系列看起来像这样

/* 1 */
{
    "_id" : 1,
    "UserSubscriptions" : [ 
    {
        "_id" : 1,
        "Subscription" : {
            "_id" : 1,
            "Publication" : {
                "_id" : 1,
                "Code" : "1MM",
            },
    },
    {
        "_id" : 2,
        "Subscription" : {
            "_id" : 2,
            "Publication" : {
                "_id" : 2,
                "Code" : "2MM",
            },      
    },
    {
        "_id" : 7,
        "Subscription" : {
            "_id" : 7,
            "Publication" : {
                "_id" : 1,
                "Code" : "1MM",
            },      
    }
]
}

/* 2 */
{
    "_id" : 2,
    "UserSubscriptions" : [ 
    {
        "_id" : 3,
        "Subscription" : {
            "_id" : 3,
            "Publication" : {
                "_id" : 1,
                "Code" : "1MM",
            }      
        }
    ]
}

/* 3 */
{
    "_id" : 3,
    "UserSubscriptions" : [ 
    {
        "_id" : 4,
        "Subscription" : {
            "_id" : 4,
            "Publication" : {
                "_id" : 1,
                "Code" : "1MM",
            }      
        }
    ]
}

/* 4 */
{
    "_id" : 4,
    "UserSubscriptions" : [ 
    {
        "_id" : 5,
        "Subscription" : {
            "_id" : 5,
            "Publication" : {
                "_id" : 2,
                "Code" : "2MM",
            }      
       }
   ]
}
 PublicationCode      Count (Number of users)
 1MM                  3
 2MM                  2 
我正在尝试获取所有“发布”和计数(用户订阅订阅计数)。所以从上面的集合中,我希望得到这样的结果

/* 1 */
{
    "_id" : 1,
    "UserSubscriptions" : [ 
    {
        "_id" : 1,
        "Subscription" : {
            "_id" : 1,
            "Publication" : {
                "_id" : 1,
                "Code" : "1MM",
            },
    },
    {
        "_id" : 2,
        "Subscription" : {
            "_id" : 2,
            "Publication" : {
                "_id" : 2,
                "Code" : "2MM",
            },      
    },
    {
        "_id" : 7,
        "Subscription" : {
            "_id" : 7,
            "Publication" : {
                "_id" : 1,
                "Code" : "1MM",
            },      
    }
]
}

/* 2 */
{
    "_id" : 2,
    "UserSubscriptions" : [ 
    {
        "_id" : 3,
        "Subscription" : {
            "_id" : 3,
            "Publication" : {
                "_id" : 1,
                "Code" : "1MM",
            }      
        }
    ]
}

/* 3 */
{
    "_id" : 3,
    "UserSubscriptions" : [ 
    {
        "_id" : 4,
        "Subscription" : {
            "_id" : 4,
            "Publication" : {
                "_id" : 1,
                "Code" : "1MM",
            }      
        }
    ]
}

/* 4 */
{
    "_id" : 4,
    "UserSubscriptions" : [ 
    {
        "_id" : 5,
        "Subscription" : {
            "_id" : 5,
            "Publication" : {
                "_id" : 2,
                "Code" : "2MM",
            }      
       }
   ]
}
 PublicationCode      Count (Number of users)
 1MM                  3
 2MM                  2 
我尝试了跟踪MongoDB查询并得到了结果

db.runCommand( {
   aggregate: "User",
   pipeline: [
     {$unwind: '$UserSubscriptions'},
     {$group: {_id: '$_id',pub: {$addToSet: 
                '$UserSubscriptions.Subscription.Publication'}}},
     {$unwind: '$pub'},
     {$group: {_id: '$pub.Code',pub:{$first:'$pub'}, count: {$sum: 1}}},
     {$project:{_id:0,"Publication":"$pub","count":1}}
 ]} )
相应的C#Mongo驱动程序代码为

 var unwind = new BsonDocument { { "$unwind", "$UserSubscriptions" } };
        var group1 = new BsonDocument
            {
                { "$group",
                    new BsonDocument
                        {
                            { "_id", "$_id"
                            },
                            {
                                "publications", new BsonDocument
                                             {
                                                 {
                                                     "$addToSet","$UserSubscriptions.Subscription.Publication"
                                                 }
                                             }
                            }
                        }
              }
            };
        var unwindCode = new BsonDocument { { "$unwind", "$publications" } };
        var group2 = new BsonDocument
            {
                { "$group",
                    new BsonDocument
                        {
                            { "_id", "$publications.Code"
                            },
                            {
                                "Publications", new BsonDocument
                                             {
                                                 {
                                                     "$first","$publications"
                                                 }
                                             }
                            },
                            {
                                "NumberOfUsers", new BsonDocument
                                             {
                                                 {
                                                     "$sum",1
                                                 }
                                             }
                            }
                        }
              }
            };

        var project = new BsonDocument
        {
            {
                "$project",
                new BsonDocument
                    {
                        {"_id", 0},
                        {"Publication","$Publications"},
                        {"NumberOfUsers", 1},
                    }
            }
        };

        var pipeline = new[] { unwind, group1, unwindCode, group2, project };
        List<BsonDocument> docs= coll.Aggregate<BsonDocument>(pipeline);
var unwind=newbsondocument{{“$unwind”,“$UserSubscriptions”};
var group1=新的BsonDocument
{
{“$group”,
新的B文件
{
{“\u id”,“$\u id”
},
{
“出版物”,新的B文件
{
{
$addToSet“,$UserSubscriptions.Subscription.Publication”
}
}
}
}
}
};
var unwindCode=新的BsonDocument{{“$unwind”,“$publications”};
var group2=新的BsonDocument
{
{“$group”,
新的B文件
{
{u id',“$publications.Code”
},
{
“出版物”,新的B文件
{
{
“$first”、“$publications”
}
}
},
{
“NumberOfUsers”,新的B文档
{
{
“$sum”,1
}
}
}
}
}
};
var项目=新的BsonDocument
{
{
“$project”,
新的B文件
{
{u id',0},
{“出版物”,“$Publications”},
{“NumberOfUsers”,1},
}
}
};
var pipeline=new[]{unwind,group1,unwindCode,group2,project};
列表单据=集合(管道);
结果“计数”与“发布”文档一致。 但是查询返回结果需要一些时间。对于5万个用户记录,大约需要23秒

请提供一些改进MongoDB查询性能的方法


(Robo 3T 1.2.1)(MongoDB.Driver 2.4.4)

主要问题是您需要查看整个采集过程(在这种情况下,您不能使用索引来加快处理速度)

您可以尝试此代码(它的操作比您的代码少):


您可以检查本机mongo查询吗?得到结果需要多少时间?当尝试使用第三方库获取数据时,hppen有时会出现内存泄漏。我在尝试使用spring mongo lib从mongodb搜索数据时遇到了这个问题。这可能会帮助您。。。为您减少至少两个阶段…@AnthonyWinzlet我想返回完整的“Publication”文档和count,所以这就是为什么添加了第二组您的管道也不返回该文档的原因。。。您要求的是查询性能,而不是发布字段,这就是为什么我建议您。。。顺便说一句,您可以使用
$first
$group
的第二阶段获取您的发布字段,我的管道正在返回该字段,请参阅我使用了相同的
{$group:{{u id:'$pub.code',pub:{$first:'$pub'},count:{$sum:1}