Как найти документы с дочерней коллекцией, содержащей только определенное значение - PullRequest
0 голосов
/ 01 июня 2019

У меня следующая структура 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. Приведенный выше документ не будет квалифицирован, так как по состоянию на обзор имеет рейтинг 10.

с Querydsl в следующей форме, я все еще получаю этот документ

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

1 Ответ

1 голос
/ 01 июня 2019

Вы можете использовать $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, чтобы удалить его.

РЕДАКТИРОВАТЬ :

Проверьте пример здесь .

...