Фильтр MongoDB для одного и того же объекта в массиве

У меня есть объект со столбцом chars с такими данными:

{
  "chars": [
    {
      "count": 1,
      "color": "red"
    },
    {
      "count": 2,
      "color": "green"
    },
    {
      "count": 3,
      "color": "blue"
    }
  ]
}

Я хочу исключить записи с лайком chars

{"count": 2, "color": "blue"}

Я фильтрую по (demo1)

{
    "$or": [
        {
            "chars.count": {
                "$ne": 2
            }
        },
        {
            "chars.color": {
                "$ne": "blue"
            }
        }
    ]
}

или (demo2)

{
    "chars.count": {
        "$ne": 2
    },
    "chars.color": {
        "$ne": "blue"
    }
}

Я хочу получить объект, но получаю пустой набор.

Я использую MongoDB 6.0.6.

Нравится эта демо ?

Yong Shun 29.07.2024 14:05

Да, но теперь не фильтры 3 и синий

M-A-X 29.07.2024 14:23

Ваш вопрос неясен. Вам нужен возвращенный документ с отфильтрованным chars в проекции? Согласно вашему вопросу, должен быть фильтр 2, а не 3?

Yong Shun 29.07.2024 14:26

Я хочу получить целый объект с массивом chars со всеми объектами в нем, потому что у меня этого нет {"count": 2, "color": "blue"}

M-A-X 29.07.2024 16:56
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
2
4
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваш запрос должен быть таким

"$or": [
    { "chars.count": { "$ne": 2 } },
    { "chars.color": { "$ne": "blue" } }
  ]
Ответ принят как подходящий

Я думаю, что вам нужно использовать оператор запроса $elemMatch для сопоставления документов, в которых есть элемент массива, содержащий { count: 2, color: "blue" }, и просто инвертировать результаты с помощью $not. Это вернет все несовпадающие документы, и я думаю, что это то, к чему вы стремитесь:

db.collection.find({
  chars: {
    $not: {
      $elemMatch: {
        count: 2,
        color: "blue"
      }
    }
  }
})

Рабочий пример смотрите ЗДЕСЬ.

Другие вопросы по теме