MongoDb Query возвращает ненужные документы - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть база данных, содержащая документы двух структур:

{
  "name": "",
  "name_ar": "",
  "description": "",
  "bla1": {
    "name": "",
    "link": "",
    "Logo": ""
  },
  "bla2": {
    "name": "",
    "id": ""
  }
}

и

{
  "name": "",
  "name_ar": "",
  "description": "",
  "bla1": {
    "name": [],
    "link": "",
    "Logo": ""
  },
  "bla2": {
    "name": "",
    "id": ""
  }
}

Я хочу запросить мою коллекцию, чтобы получить документы с "bla1.name", точно равным чему-либо. Однако, используя следующий запрос:

{$and: [{'bla1.name': {'$type': 'string'}}, {"bla1.name":'something'}]}

возвращает все документы (даже если «bla1.name» является массивом), содержащие имя: «что-то».

Что я делаю не так?

1 Ответ

0 голосов
/ 08 ноября 2018

Из документов MongoDB:

$ type теперь работает с массивами так же, как и с другими типами BSON. Предыдущие версии соответствовали только документам, в которых поле содержало вложенный массив.

Это означает, что: если массив имеет хотя бы один элемент с заданным типом, он выбирается.

Если вы хотите исключить массивы как тип, вы должны расширить свой запрос. Поскольку запрос уже соответствует строкам, вы можете исключить выбор типа для строки:

$and: [
  // not necessary any more, as this selection is already implied by the last part
  // {
  //   "bla1.name": {
  //     "$type": "string"
  //   }
  // },
  {
    "bla1.name": {
      $not: {
        "$type": "array"
      }
    }
  }, {
    "bla1.name": "something"
  }
]

См. Официальные документы: https://docs.mongodb.com/manual/reference/operator/query/type/#behavior

Вот рабочая демонстрация на игровой площадке Монго: https://mongoplayground.net/p/3ri7Bjfrae8

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...