MongoDB-加入集合、筛选和排序
我有两个系列,“商业”和“评论”: 我想数一数每家公司平均得到了多少颗星,然后按这个值降序排列。到目前为止,我已经:MongoDB-加入集合、筛选和排序,mongodb,Mongodb,我有两个系列,“商业”和“评论”: 我想数一数每家公司平均得到了多少颗星,然后按这个值降序排列。到目前为止,我已经: db.getCollection('review') .aggregate ([ { $group: { _id: "$business_id", avgStars: {$avg: "$stars"} } }, { $lookup: { from: "business", lo
db.getCollection('review')
.aggregate
([
{
$group:
{
_id: "$business_id",
avgStars: {$avg: "$stars"}
}
},
{
$lookup:
{
from: "business",
localField: "_id",
foreignField: "business_id",
as: "business_data"
}
},
{$unwind: "$business_data"},
{$project: {"name": "$business_data.name", "avgStars": "$avgStars"}},
//{$sort: {avgStars: -1}}
])
如果没有注释部分,它可以工作-获取(_id,name,avgStars)的列表。当我取消注释
$sort
函数时,它停止工作-Robo3T无限处理。集合只有50个元素。为什么排序不起作用?将此查询作为参考,将$sort的顺序放在投影阶段之前
db.review.aggregate([ {
$group: {
_id:"$business_id",
avgStars: { $avg:"$stars" }
}
},
{
$lookup:{
from:"business",
localField:"_id",
foreignField:"business_id",
as:"business_data"
}
},
{
$unwind:"$business_data"
},
{
$sort :{ "avgStars":-1 }
},
{
$project:{
"name":"$business_data.name",
"avgStars":"$avgStars"
}
}
])
如果是第二阶段(在查找之前),排序是否有效?@AlexBlex是的,但它是。。。奇怪的我只做了
$group
和$sort
,在对所有avgStars
字段进行排序后,它们的值为5.0A。我猜您的集合略大于50个元素。什么数字.count()
给了你这两个数字?@AlexBlex是的,你说得对!这些集合实际上每个都有超过一百万个元素。。。Robo3T显示了50个元素,但没有任何迹象表明还有更多元素(并且有一些误导性迹象…)。所以,难怪用其他操作排序需要这么长时间,谢谢。用你的代码排序时它会冻结(我用$project
注释掉了它)
db.getCollection('review')
.aggregate
([
{
$group:
{
_id: "$business_id",
avgStars: {$avg: "$stars"}
}
},
{
$lookup:
{
from: "business",
localField: "_id",
foreignField: "business_id",
as: "business_data"
}
},
{$unwind: "$business_data"},
{$project: {"name": "$business_data.name", "avgStars": "$avgStars"}},
//{$sort: {avgStars: -1}}
])
db.review.aggregate([ {
$group: {
_id:"$business_id",
avgStars: { $avg:"$stars" }
}
},
{
$lookup:{
from:"business",
localField:"_id",
foreignField:"business_id",
as:"business_data"
}
},
{
$unwind:"$business_data"
},
{
$sort :{ "avgStars":-1 }
},
{
$project:{
"name":"$business_data.name",
"avgStars":"$avgStars"
}
}
])