如果我的文档集合看起来或多或少像这样:
{
"_id": "52c06c86b78a091f26000001",
"desc": "Something somethingson",
"likes": [
{
"user_id": "52add4f4344e8ca867000001",
"username": "asd",
"created": 1390652212592
},
{
"user_id": "52add4f4344e8ca867000001",
"username": "asd",
"created": 1390652212592
}
],
"user_id": "52add4f4344e8ca867000001",
"username":"username"
}
我可以使用mongodb(使用nodejs& express)获取10个用户最喜欢的帖子列表吗?
我认为应该可以通过“user_id”对所有帖子进行分组,然后计算“likes”数组中的项目总数来实现Map-Reduce或Aggregate。然后从那里获得前10名“user_id”。
我猜这是可能的。唯一的问题是我没有从mongo网站获得足够的例子来组合我自己的东西。
有人能告诉我这样做的一个例子,或者至少告诉我它是不可能的。 =)
答案 0 :(得分:4)
尝试一下......
db.collection.aggregate([
{$unwind: "$likes"},
{$group: {_id: "$user_id", likesCount: {$sum: 1}}},
{$sort: {likesCount: -1}},
{$limit: 10},
{$project: {_id: 1}}
])
请参阅此tutorial。
答案 1 :(得分:2)
是,有可能:
db.coll.aggregate([
{
$unwind: "$likes"
},
{
$group: {
_id: "$user_id",
likesPerUser: {
$sum:1
}
}
}
{
$sort: {
likesPerUser: -1
};
}
{
$limit: 10
}
])
答案 2 :(得分:0)
如果您需要计算每位父用户的喜欢元素数量,您可以执行以下操作:
http://mongotry.herokuapp.com/#?bookmarkId=52fb8c604e86f9020071ed71
[
{
"$unwind": "$likes"
},
{
"$group": {
"_id": "$user_id",
"likesPerUser": {
"$sum": 1
}
}
},
{
"$sort": {
"likesPerUser": -1
}
},
{
"$limit": 10
}
]
否则,如果您需要相同的用户ID数量,每个子文档计数1遍及所有父母,您可以执行以下操作:
http://mongotry.herokuapp.com/#?bookmarkId=52fb8cf74e86f9020071ed72
[
{
"$unwind": "$likes"
},
{
"$group": {
"_id": "$likes.user_id",
"likesPerUser": {
"$sum": 1
}
}
},
{
"$sort": {
"likesPerUser": -1
}
},
{
"$limit": 1
}
]