Фильтр 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.

🤔 А знаете ли вы, что...
MongoDB обладает активным сообществом разработчиков и богатой документацией...


2
54
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"
      }
    }
  }
})

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