我的数据库中有这个集合:
{ "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" }
如何获得此结果:
拥有一件商品的用户:2
有两个项目的用户:1
有三个项目的用户:1
答案 0 :(得分:2)
您需要先IdUser
IdUser
文档,然后使用$group
累加器运算符计算每个db.items.aggregate([
{ "$group": {
"_id": "$IdUser",
"count": { "$sum": 1 }
}},
{ "$group": {
"_id": "$count",
"nUsers": { "$sum": 1 }
}}
])
出现在您的集合中的时间。这允许您在下一阶段按“计数”对文档进行分组,并返回具有相同数量“项目”的“用户”计数。
var progress = document.createElement('div');
var progressBar = document.createElement('div');
progress.appendChild(progressBar);
document.body.appendChild(progress);
var manager = new THREE.LoadingManager();
manager.onProgress = function ( item, loaded, total ) {
progressBar.style.width = (loaded / total * 100) + '%';
};
function addRandomPlaceHoldItImage(){
var r = Math.round(Math.random() * 4000);
new THREE.ImageLoader(manager).load('http://placehold.it/' + r + 'x' + r);
}
for(var i = 0; i < 10; i++) addRandomPlaceHoldItImage();
答案 1 :(得分:1)
使用 aggregate(
)方法会为您提供所需的结果,但输出文档的不同之处在于,您有两个不同的字段值,而不是键/值对显示用户数量及其各自的数量
项目数。以下聚合管道解释了这一点:
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" }
}
}
])
在上文中,您 $group
用户密钥获取所有文件,并考虑到可能没有商品字段的文件,这些文件会在骨料。然后需要进一步执行 $group
操作,然后以数组的形式获取每个计数的用户。
管道中的最后一步 $project
用于重塑最终输出,以便您获得以下输出(随问题提供示例文档):
{ "number_of_items" : 1, "number_of_users" : 2 }
{ "number_of_items" : 3, "number_of_users" : 1 }
{ "number_of_items" : 2, "number_of_users" : 1 }