如何根据MongoDB中列表的数量过滤文档?

时间:2019-03-25 17:00:32

标签: mongodb aggregation-framework

在MongoDB中,我正在寻找包含至少5条餐厅评论的文档。 我试过在$ match上添加一个过滤器,例如:

stat_valleys

但是,这将为我提供评论评分至少为5或更高的文档,而我希望评论数量至少为5。

set.seed(1)
x <- 1:10
y <- runif(10)
# Maxima
x[ggpmisc:::find_peaks(y)]
[1] 4 7
y[ggpmisc:::find_peaks(y)]
[1] 0.9082078 0.9446753
# Minima
x[ggpmisc:::find_peaks(-y)]
[1] 5
y[ggpmisc:::find_peaks(-y)]
[1] 0.2016819    
# Plot
ggplot(data = data.frame(x, y), aes(x = x, y = y)) + geom_line() + stat_peaks(col = "red") + stat_valleys(col = "green")

这就是我得到的:

{"grades.score: {$gt: 4}}

这就是我需要的:

db.restaurants.aggregate([
...         {"$match":
...             {"$and":[
...                 {"borough":"Bronx"},
...                 { "cuisine": "American "},
...                 {"address.zipcode":"10467"}]}},
...     {"$group":
...         {"_id":
...             {"name" : "$name",
...              "grades.score" : "$grades.score"}}}])

2 个答案:

答案 0 :(得分:1)

您可以根据您的示例进行尝试:

db.restaurants.aggregate([{
        "$match": {
            "$and": [{
                    "borough": "Bronx"
                },
                {
                    "cuisine": "American "
                },
                {
                    "addresszipcode": "10467"
                }
            ]
        }
    },
    {
        "$group": {
            "_id": {
                "name": "$name",
                "score": "$grades.score",
            }
        }
    },
    {
        $match: {
            $expr: {
                $gte: [{
                    $size: "$score"
                }, 5]
            }
        }
    }
])

使用最终的$ match与$ expr来执行聚合表达式

答案 1 :(得分:0)

非常感谢Julien。

最后,我改用$ project解决了它。很抱歉在找到解决方案之前不回复。

pipeline1 = []
step1 = {"$match":{"$and":[{"borough": borough},{ "cuisine": cuisine},{"address.zipcode": zipcode}]}}
pipeline1.append(step1)
step2 = {"$project": { "_id":0, "name":1, "fiveOrMore": { "$gte": [ {"$size":"$grades.score" }, 5 ] }, "grades.score" :1} }
pipeline1.append(step2)
step3 = {"$match": { "fiveOrMore" : True }}
pipeline1.append(step3)
step4 = {"$unwind": "$grades"}
pipeline1.append(step4)
step5 = {"$group":{"_id": "$name", "averageReview": {"$avg": "$grades.score"}}}
pipeline1.append(step5)