Как искать в коллекции с неизвестной структурой? - PullRequest
1 голос
/ 21 ноября 2011

Я провел несколько часов, читая документы и форумы, пытаясь найти решение для следующей проблемы:

В базе данных Mongo у меня есть коллекция с некоторыми неструктурированными данными:

{"data": "some data", "_id": "497ce96f395f2f052a494fd4"}

{"more_data": "more data here", "recursive_data": {"some_data": "даже больше данныхздесь "," _id ":" 497ce96f395f2f052a4323 "}

{" more_unknown_data ":" строка или даже словари "," _id ":" 497ce96f395f2f052a494fsd2 "}

...

1013 *

Суть в том, что элементы в этих коллекциях не имеют предопределенной структуры и могут иметь неограниченные уровни.

Моя цель - создать запрос, который просматривает коллекцию и находит все элементы, которые соответствуют регулярному выражению (как в ключах, так и в значениях).

Например, если яиметь регулярное выражение: '^ даже больше' - он должен возвращать все элементы, которые имеют строку "еще больше" где-то в структуре.В этом случае - это будет второй.

Ответы [ 2 ]

4 голосов
/ 21 ноября 2011

Просто добавьте массив к каждому объекту и заполните его строками, по которым вы хотите искать. Обычно я делаю эти значения строчными, чтобы упростить поиск без учета регистра.

например. Теги: ["копия строки 1", "копия строки 2", ...]

Вы можете расширить эту технику, чтобы индексировать каждое слово каждого элемента. Иногда я также добавляю поле с идентификатором перед ним, например, «жанр: рок», который позволяет искать значения в определенных полях (тщательно выбирайте символ «:»).

Добавьте индекс для этого массива, и теперь у вас есть возможность искать любое слово или фразу в любом документе в коллекции, и вы можете искать «genre: rock» для поиска этого значения в определенном поле.

0 голосов
/ 21 ноября 2011

Когда-нибудь, если вы найдете способ сделать это, вы все равно столкнетесь с проблемой медленного поиска, потому что нет индексов

У меня была похожая проблема, и решение было создать дополнительную базу данных (на том же движке или любой другойдругие, более подходящие для поиска) и заполнить его ключами монго и объединить в одно текстовое поле данных.И обновлять его всякий раз, когда mongodb обновляет данные.

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

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