Отображение условного размера массива с другими полями документа mongodb

#mongodb #aggregation-framework

Вопрос:

У меня есть коллекция fridges , и я хотел бы, чтобы некоторые поля из каждого холодильника соответствовали условию плюс «условный размер» предметов в этом холодильнике.

Это пример моей базы данных :

 db={
  "fridges": [
    {
      _id: 1,
      items: [
        {
          itemId: 1,
          name:"beer"
        },
        {
          itemId: 2,
          name: "chicken"
        }
      ],
      brand:"Bosch",
      size:195,
      cooler:true,
      color:"grey"
    },
    
    {
      _id: 2,
      items: [
        {
          itemId: 1,
          name:"beer"
        },
        {
          itemId: 2,
          name: "chicken"
        },
        {
          itemId: 3,
          name: "lettuce"
        }
      ],
      brand:"Electrolux",
      size:200,
      cooler:true,
      color:"white"
    },
  ]
}
 

Я хочу разобраться fridges с этими взаимными условиями (условие «и»).:

  • brand является $in ["Bosch","Samsung"]
  • color является $in ["grey","white"]

Кроме того : Количество предметов с именем $in ["beer","lettuce"]

И, наконец,: удаление некоторых полей, таких как size и items результата.

В нашем примере исключенный вывод будет :

 {
  _id:1
  itemsNumber:1,
  brand:"Bosch",
  cooler:true,
  color:"grey"
}
 

Объяснения :
Мы удалили поле items и size itemsNumber подсчитали количество пива и салата из items массива. И мы держим только первый холодильник, его марка Bosch, и он серый.

Это то, что у меня есть до сих пор :

 db.fridges.aggregate([
  {
    "$match": {
      $and: [
        {
          "brand": {
            $in: [
              "Bosch",
              "Samsung"
            ]
          }
        },
        {
          "color": {
            $in: [
              "grey",
              "white"
            ]
          }
        }
      ]
    }
  },
  {
    "$project": {
      "itemsNumber": {
        $size: "$items" // This is not good
      },
      brand: 1,
      cooler: 1,
      color: 1
    }
  }
])
 

Что возвращает меня :

 [
  {
    "_id": 1,
    "brand": "Bosch",
    "color": "grey",
    "cooler": true,
    "itemsNumber": 2
  }
]
 

Подсчет предметов, соответствующих одному beer или lettuce другому, — моя главная проблема.
Это исполняемый пример.

Заранее спасибо!

Комментарии:

1. Вы пробовали использовать $filter ?

2. В настоящее время я пытаюсь его использовать, но пока он не работает.

Ответ №1:

Я узнал, как заставить его работать. Спасибо @joe за то, что предложил использовать фильтр, это действительно было решением.

Вот полный запрос :

 db.fridges.aggregate([
  {
    $match: {
      $and: [
        {
          "brand": {
            $in: [
              "Bosch",
              "Samsung"
            ]
          }
        },
        {
          "color": {
            $in: [
              "grey",
              "white"
            ]
          }
        }
      ]
    }
  },
  {
    $project: {
      "itemsNumber": {
        "$filter": {
          "input": "$items",
          "as": "item",
          "cond": {
            $in: [
              "$item.name",
              [
                "beer",
                "lettuce"
              ]
            ]
          }
        }
      },
      brand: 1,
      cooler: 1,
      color: 1
    }
  }
])
 

Выполнимый пример.