Поиск по индексу массива MongoDB - PullRequest
0 голосов
/ 29 января 2011

Я использую MongoDB для хранения группы информации, и мне нужно искать значения в индексированном массиве.

Вот схема:

{ "common_name" : { "name" : "thename", "type" : "thetype" } } 

Вдокумент, но это единственный, который я ищу.

Итак, я подумал, что-то вроде этого будет работать: (в оболочке)

db.collection.find({common_name:{$in:"thename"}})

Но я ничего не получаю обратно.

Это похоже на то, что здесь делается: http://www.php.net/manual/en/mongo.queries.php - Но я не могу ничего вернуть.

Я пытался

db.collection.find({"common_name.name":"thename"}})

и он работает, как и ожидалось, но при поиске по нескольким узлам в индексе (до 4) он может быть уродливым, в основном определяя $ или индекс для каждой подкатегории и увеличивая время запроса в четыре раза.Поскольку это приводит в действие автозаполнение, я не могу этого сделать.

Как ни странно, следующее также не возвращает никаких документов:

db.collection.find({"common_name":{"name":"thename"}})

Что, на мой взгляд, точното же самое, что и вышеупомянутый запрос.

Я довольно новичок в Mongo, так что, может быть, мне здесь не хватает чего-то большого?

Есть идеи, как получить самый быстрый доступ к этомуданные (используя привязанное регулярное выражение)?

Я мог бы просто использовать реляционную таблицу, но разве это не противоречит цели системы NoSQL, такой как Mongo?

Ответы [ 2 ]

2 голосов
/ 29 января 2011

Проблема в том, что у вас нет массива.Массив будет выглядеть так: { "common_name" : [ "name1", "name2", "name3" ] }

При такой структуре Mongo может индексировать элементы массива в одном индексе и быстро находить любой документ, содержащий какой-либо отдельный элемент из массива.

Вы могли бы использовать массив и просто определить смещения, которые вам нужны, например, [0] - это имя, [1] - тип и т. Д. Теперь вы можете найти любой документ.быстро.

Вы могли бы сделать это в дополнение к хранению данных в именованных полях (но очевидно, что это увеличит объем хранилища, поэтому не рекомендуется).

Если ваше автозаполнение не должно быть полностью актуальным с последними документами, добавленными в коллекцию, вы можете вместо этого запустить задание map-Reduce , чтобы создать отдельную коллекцию, которую вы используететолько для автозаполнения.Шаг карты будет генерировать для каждого из отдельных полей имени в документе (таким образом, в 4 раза больше документов после выделения), а шаг сокращения подсчитывает, сколько было каждого имени (так что в 1 раз количество уникальных имен во всех полях),Вы можете индексировать полученную коллекцию по имени и количеству, что позволит автозаполнению сначала рекомендовать наиболее распространенные имена.

1 голос
/ 30 января 2011

db.collection.find({"common_name":{"name":"thename"}}) Что, на мой взгляд, в точности совпадает с запросом, приведенным выше.

Нет, это не так, потому что это будет соответствовать, только если значение common_name будетпросто name: thename}, вам нужен оператор $ elemMatch .

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