Как применить фильтр для вывода структуры агрегации Mongo Db?

Я пытаюсь применить условие для вывода агрегации Mongo Db, но до сих пор не понять идею. Вот мои образцы документов:

{
 'id':1,
 'customerReviews':[5,7,8],
 'expertReviews':[9,8,9]
},
{
 'id':1,
 'customerReview':[6,7,7],
 'expertReview':[4,8,9]
}

Так что, если у меня есть требование типа найти все документы, у которых min(customer_review) > 5 -> только второй документ правильный.

Вот моя начальная точка, которая получает минимум (customerReview) документов:

db.getCollection('subscriber').aggregate([
{$unwind:"$customerReviews"},
{"$group":{
   "_id":"$_id",
   "min_customer_review":{"$min":"$customerReviews"}}}
]);

который производит:

{
  "_id" : ObjectId("58ab1d6892bf3194a9719883"),
  "min_customer_review" : 5
},
{
  "_id" : ObjectId("58ab1d6892bf3194a9719883"),
  "min_customer_review" : 6
}

Так как же продолжать применять фильтр для агрегации, чтобы получить все документы с min_customer_review > 5?

Еще один вопрос, может ли он применить вторую агрегацию, например, "получить все фильмы, у которых min_customer_review> 5 или average_expert_reviews > 6"?

Спасибо всем

1 ответ

Решение

Ты можешь использовать $redact,

$redact просмотреть документ и выполнить $$KEEP а также $$PRUNE по критериям запроса.

db.subscriber.aggregate(
    [{
        $redact: {
            $cond: {
                if: {
                    $gt: [{
                        $min: "$customerReviews"
                    }, 5]
                },
                then: "$$KEEP",
                else: "$$PRUNE"
            }
        }
    }]
);

Вы можете обернуть больше условий в $or оператор.

Заменить значение в if блокировать с

{ $or:[{$gt: [{ $min: "$customerReviews"}, 5 ] }, {$gt: [{ $avg: "$expertReviews"}, 6 ] } ]}
Другие вопросы по тегам