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" 
                         } 
                     } 
           ])