0

我有一个餐厅集合,其中每个文档都有一个名为“grades”的数组,它将“date”、“score”、“grade”存储为单独的文档。我想要做的是选择在所有 4 个日期得分均高于 60 的餐厅。我正在尝试提出一个查询,该查询将与具有 n 个分数的数组一起使用

I've tried this query: 
       db.r.find(
       {$nor:[{"grades.score":{$lt:50,$gt:90}}]},
       {_id:0,grades:1}
       ).limit(5).pretty();

{
        "_id" : ObjectId("5d92477d5a50e0f057174914"),

        "grades" : [
                {
                        "date" : ISODate("2014-09-06T00:00:00Z"),
                        "grade" : "A",
                        "score" : 2
                },
                {
                        "date" : ISODate("2013-07-22T00:00:00Z"),
                        "grade" : "A",
                        "score" : 11
                },
                {
                        "date" : ISODate("2012-07-31T00:00:00Z"),
                        "grade" : "A",
                        "score" : 12
                },
                {
                        "date" : ISODate("2011-12-29T00:00:00Z"),
                        "grade" : "A",
                        "score" : 12
                }
        ],
        "name" : "Dj Reynolds Pub And Restaurant",
        "restaurant_id" : "30191841"
}
4

1 回答 1

0

没有过滤器查询可以直接实现这一点。您唯一能做的就是使用聚合框架并达到您想要的结果。首先,您必须展开grades数组,然后过滤所有score大于 60 的文档,然后_id使用$push重新创建数组进行分组grades,然后再次使用 match仅过滤grades数组大小为 的文档n

以下查询适用于 n=4 的文档

[{
    $unwind: {
        path: "$grades"
    }
}, {
    $match: {
        "grades.age": {
            $gte: 60
        }
    }
}, {
    $group: {
        _id: "$_id",
        grades: {
            $push: "$grades"
        }
    }
}, {
    $match: {
        "grades": {
            $size: 4
        }
    }
}]
于 2019-10-01T10:01:39.570 回答