Пн go Агрегация БД с массивом объектов - PullRequest
0 голосов
/ 05 мая 2020

Моя схема коллекции выглядит следующим образом:

Продукт

{
  _id: ObjectId(), // default mongo db id
  specification: [
    {key: 'Name', value: "value 1"},
    {key: 'Category', value: "value 2"},
    {key: 'Department', value: "value 3"}
  ]
}

Теперь я хочу запросить это с помощью универсального фильтра c. Например,

  1. Получить все продукты с помощью Name = value 1 и Category in [value 2, value 3] и Department = value 3
  2. Получить все продукты с помощью Name = value 1, Category = value 2 или Department in [value 3, value 4]

Я пытался использовать $match с $elemMatch. Но это позволяет только один запрос, но я не могу использовать операторы $and и $or.

1 Ответ

0 голосов
/ 05 мая 2020

Вы можете использовать $elemMatch нормально, вам просто нужно поставить $and / $or на верхнем уровне.

Ваш первый пример будет

db.products.find({
  $and: [
    { 
      specification: {
        $elemMatch: { key: 'Name', value: 'value 1' }
      }
    },
    {
      specification: {
        $elemMatch: { key: 'Category', value: { $in: ['value 1', 'value 2'] } }
      }
    },
    { 
      specification: {
        $elemMatch: { key: 'Department', value: 'value 3' }
      }
    }
  ]
})
...