MongoDB在前一阶段结果上聚合匹配

时间:2017-12-04 01:29:28

标签: mongodb conditional match aggregate pipeline

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

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

<!DOCTYPE ourapi SYSTEM "nameOfTheDTD.dtd">  
<mainPart version="7.0">  
   <some other stuff>
</mainPart>  

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

例如:

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

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

哪个收益率:

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

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

{ "_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 }

要得到这个:

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

这里我指定的评级大于或等于4.2。但是,我想使用&#34; $ group&#34;的一个值。阶段计算。 (例如餐厅XYZ的评级而不是4.2)。我希望它是动态的,所以当我将来运行这个查询时,它会根据XYZ的平均评分而改变。

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

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

0 个答案:

没有答案