Найти вложенные документы в MongoDB, которые являются значениями пары имя / значение, а не элементами массива - PullRequest
1 голос
/ 09 июня 2019

Возможно, моя структура документа не очень подходит для того, что я пытаюсь сделать, но после некоторого труда я понял, что $elemMatch, вероятно, не будет моим другом.Вот пример документа:

{
  "field": {
    "abc": {
      x: 0,
      str: "aaa"
    },
    "def": {
      x: 1,
      str: "bbb"
    },
    "ghi": {
      x: 2,
      str: "ccc"
    }
  }
}

Я пытаюсь создать запрос, который находит документы, удовлетворяющие «field. $. X> 1» или что-нибудь в этом роде.В основном, название поля на втором уровне может быть любым.Если бы field был массивом, я думаю, $elemMatch работал бы прекрасно.

1 Ответ

1 голос
/ 09 июня 2019

Поскольку вы не знаете имен ключей, вы должны использовать $ objectToArray , который преобразует field в массив из трех пар ключ-значение. Затем вы можете запустить $ map , чтобы применить ваше условие к x и $ anyElementTrue , чтобы проверить, соответствует ли какой-либо элемент указанным критериям:

db.collection.find({
    $expr: {
        $anyElementTrue: {
            $map: {
                input: { $objectToArray: "$field" },
                in: { $gt: [ "$$this.v.x", 1 ] }
            }
        }
    }
})

Детская площадка Монго

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