фильтровать по вложенному документу при отображении всего родительского документа mongoose mongodb

#mongodb #mongoose #mongodb-query #aggregation-framework

#mongodb #mongoose #mongodb-запрос #агрегация-фреймворк

Вопрос:

Это модель схемы

 const tokoSchema = new mongoose.Schema({
    name: String
    product: [{display: Boolean}]
}
  

Итак, я хочу фильтровать данные по product.display . Когда я фильтровал его с помощью toko.find({"product.display": true}) , он показывает только список toko, который имеет product.display: true , но я хочу, чтобы, если отображение продукта является ложным, оно продолжало показывать _id и name toko с пустым массивом продукта [] . Ожидаемый пример запроса

 // showing all tokos
[
  {
   _id: blabla
   name: "test",
   product: [{_id: blabla, display: true}], // filter display:true
   },
   {
   _id: blabla,
   name: "test",
   product: [] // no product with display:true
   }
 ]
  

пример toko.find({"product.display": true}) запроса

 // not showing all tokos
[
  {
   _id: blabla
   name: "test",
   product: [{_id: blabla, display: true}]
   },
 ]
  

есть решение для этого? должен ли я использовать aggregate?

Ответ №1:

Для массива вам нужен $filter:

 db.toko.aggregate([
    {
        $addFields: {
            product: {
                $filter: {
                    input: "$product",
                    cond: {
                        $eq: [ "$$this.display", true ]
                    }
                }
            }
        }
    }
])
  

Игровая площадка Mongo