如何查找带有仅包含特定值的子集合的文档

时间:2019-05-31 21:39:50

标签: mongodb querydsl

我具有以下JSON结构:

    {
        "id": "5cea8bde0c80ee2af9590e7b",
        "name": "Sofitel",
        "pricePerNight": 88,
        "address": {
            "city": "Rome",
            "country": "Italy"
        },
        "reviews": [
            {
                "userName": "John",
                "rating": 10,
                "approved": true
            },
            {
                "userName": "Marry",
                "rating": 7,
                "approved": true
            }
        ]
    }

我想查找类似文档的列表,其中评论的所有评分值均满足特定条件,例如。小于8。以上评论将其视为不合格。

使用Querydsl的以下格式,我仍然可以获取该文档

BooleanExpression filterByRating = qHotel.reviews.any().rating.lt(8);

1 个答案:

答案 0 :(得分:0)

您可以使用$filter$match过滤掉不需要的交易。以下查询应做到:

注意:$过滤器中的cond与您的条件相反。由于您需要ratings 小于8 ,因此在这种情况下,您将需要ratings 大于或等于8

db.qHotel.aggregate([
{
    $addFields: {
        tempReviews: {
            $filter: {
                input: "$reviews",
                as: "review",
                cond: { $gte: [ "$$review.rating", 8 ] } // Opposite of < 8, which is >= 8
            }
        }
    }
},
{
    $match : {
        tempReviews : [] // This will exclude the documents for which there is at least one review with review.rating >= 8
    }
}
]);

最后的结果将包含一个名为tempReviews的空字段,您可以使用$project删除它。