MongoDB: запрос к значению во вложенном массиве? - PullRequest
3 голосов
/ 26 декабря 2011

У меня есть документы с такой схемой:

{
   ...
  "coverages" : [
    [
      "GB",
      "WC1"
    ],
    [
      "GB",
      "SE2"
    ],
    ...
  ]
}

Я хочу найти все документы, где 'coverages' содержит массив, второй элемент которого начинается с 'WC', т.е. покрытия совпадают с ['GB ', / ^ WC /].

Есть ли способ сделать это с помощью стандартного языка запросов mongodb?

Полагаю, это легко сделать с помощью пользовательской функции JavaScript, но в документах говорится, что она намного медленнее ...

Спасибо!

PS Я бы хотел избежать изменениясхема.

обновление: в Mongo есть ошибка / неправильная выборка: https://jira.mongodb.org/browse/SERVER-1264

Ответы [ 2 ]

5 голосов
/ 27 декабря 2011

Я думаю, это должно работать:

db.mycollection.find({"coverages": {"$elemMatch": {"2": /^WC/}}})
0 голосов
/ 27 декабря 2011

db.collection.find({ "coverages.0.1": /^WC/ }) должен сделать свое дело. Это говорит о совпадении документов, где второй элемент первого массива в ключевых покрытиях начинается с WC.

Однако это плохая схема, если вы пытаетесь связать ГБ (первый элемент в массиве) со вторым элементом в массиве.

Это естественный случай для документа / объекта / словаря, который сопоставляет ключи со значениями.

Сделай так:

{
  "coverages" : { "GB": "WC1" }
}

Теперь ваш запрос более естественно соответствует вашей логике: db.collection.find({ "coverages.gb": /^WC/ })

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