Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB聚合匹配上一阶段的结果_Mongodb_Conditional_Match_Aggregate_Pipeline - Fatal编程技术网

MongoDB聚合匹配上一阶段的结果

MongoDB聚合匹配上一阶段的结果,mongodb,conditional,match,aggregate,pipeline,Mongodb,Conditional,Match,Aggregate,Pipeline,我是MongoDB的新手,我不确定这是否可行,但我想我会问一下 我有一系列文件,其定义如下: { "_id": string "Reviews": [{ "Ratings": numeric, "Author": string, "ReviewID": string, "Date": ISODate() }], "Restaurant": { "ID": string,

我是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的平均评级进行更改

db.reviews.aggregate(
    {$unwind:"$Reviews"},
    {$group:{_id:"$HotelInfo.Name", AvgOverallRating:{$avg:"$Reviews.Ratings.Overall"}}},
    {$match: {_id: {$ne:null}}},
    {$match: {"AvgOverallRating": {$gte: 4.2}}}
)
是否可以在一个聚合查询中执行此操作


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

为了更好地了解您的问题,您可以发布集合中的示例文档和您期望的输出,以及您迄今为止尝试的内容?@ClementAmarnath我刚刚根据您的建议更新了帖子。聚合管道的工作原理是集合中的每个文档都迭代一次,因此,我不确定我们是否能够实现您的场景,即拾取一个动态平均值并将其传递给聚合管道上的同一个集合。请看@ClementAmarnath,因为您认为这是不可能的。即使有两个不同的/单独的查询,您是否可以建议一种方法?