MongoDB 聚合匹配上一阶段结果

MongoDB aggregate match on previous stage result

提问人:Aman A. 提问时间:12/4/2017 最后编辑:Aman A. 更新时间:12/4/2017 访问量:1642

问:

我是MongoDB的新手,我不确定这是否可行,但我想我会问。

我有一组文档,定义如下:

{
    "_id": string
    "Reviews": [{
        "Ratings": numeric,
        "Author": string,
        "ReviewID": string,
        "Date": ISODate()
    }],
    "Restaurant": {
        "ID": string,
        "Name": string,
        "URL": string,
        "Address": string
    }
}

我想做的是计算所有餐厅的平均评分,然后得到评分高于 XYZ 餐厅的餐厅。

例如:

为了计算平均值,我使用以下查询:

db.reviews.aggregate(
    {$unwind:"$Reviews"},
    {$group:{_id:"$Restaurant.Name", AvgOverallRating:{$avg:"$Reviews.Rating"}}},
    {$match: {_id: {$ne:null}}}
)

其结果是:

{ "_id" : "ABC Restaurant", "AvgOverallRating" : 4.9 }
{ "_id" : "DEF Restaurant", "AvgOverallRating" : 4.4 }
{ "_id" : "GHI Restaurant", "AvgOverallRating" : 4.5 }
{ "_id" : "JKL Restaurant", "AvgOverallRating" : 3.0 }
{ "_id" : "MNO Restaurant", "AvgOverallRating" : 3.2 }
{ "_id" : "PQR Restaurant", "AvgOverallRating" : 3.7 }
{ "_id" : "STU Restaurant", "AvgOverallRating" : 4.8 }
{ "_id" : "XYZ Restaurant", "AvgOverallRating" : 4.2 }

然后在同一查询中,我想根据 XYZ 平均评级进行匹配。

db.reviews.aggregate(
    {$unwind:"$Reviews"},
    {$group:{_id:"$HotelInfo.Name", AvgOverallRating:{$avg:"$Reviews.Ratings.Overall"}}},
    {$match: {_id: {$ne:null}}},
    {$match: {"AvgOverallRating": {$gte: 4.2}}}
)

要获得此内容,请执行以下操作:

{ "_id" : "ABC Restaurant", "AvgOverallRating" : 4.9 }
{ "_id" : "DEF Restaurant", "AvgOverallRating" : 4.4 }
{ "_id" : "GHI Restaurant", "AvgOverallRating" : 4.5 }
{ "_id" : "STU Restaurant", "AvgOverallRating" : 4.8 }
{ "_id" : "XYZ Restaurant", "AvgOverallRating" : 4.2 }

在这里,我将额定值指定为大于或等于 4.2。但是,我想使用“$group”阶段计算的值之一。(例如,餐厅 XYZ 的评分而不是 4.2)。我希望它是动态的,因此当我将来运行此查询时,它会根据 XYZ 的平均评级而变化。

是否可以在一个聚合查询中执行此操作?

如果没有,我如何使用多个查询来执行此操作?

MongoDB 条件语句 匹配 聚合 管道

评论

0赞 Clement Amarnath 12/4/2017
为了更好地了解您的问题,您可以发布集合中的示例文档和您期望的输出以及到目前为止您尝试过的内容?
0赞 Aman A. 12/4/2017
@ClementAmarnath 我刚刚根据您的建议更新了帖子。
0赞 Clement Amarnath 12/5/2017
聚合管道的工作原理是集合中的每个文档都迭代一次,因此我不确定我们是否可以实现选择动态平均值并将其传递给聚合管道上的同一集合的方案。请看 docs.mongodb.com/manual/reference/operator/aggregation
0赞 Aman A. 12/6/2017
@ClementAmarnath,因为你建议这是不可能的。即使有两个不同/单独的查询,您也能建议一种方法吗?

答: 暂无答案