Сравнение документов в MongoDB - PullRequest
3 голосов
/ 02 февраля 2012

Я хочу сравнить поля между потенциально миллионами документов в коллекции монго. Поля будут определены заранее, и каждому полю будет присвоен вес. Эти веса затем будут использоваться для возврата пар документов, представляющих предложения для «похожих» документов. Например, если сравниваются 2 документа, и оба имеют одинаковое значение для поля 'first_name', на таблицу весов будут ссылаться, и к баллу для пары будет добавлен этот вес. Если между двумя полями одинаковое поле, счет будет обновлен, чтобы отразить более высокое сходство.

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

Я открыт для любых предложений, включая реализации MapReduce (на самом деле не кажется применимыми), манипуляции с курсором, почти все, что вы можете придумать, чтобы упростить процесс, потому что я сейчас работаю на сложности O (n ^ 2) ( Ну, немного лучше, когда я пропускаю документы, которые были рассмотрены первым итератором).

1 Ответ

0 голосов
/ 02 февраля 2012

Чтобы избежать n ^ 2, вам нужно взглянуть на хранение полей и их значений в коллекции ссылок, например, :

{
    field: "firstName",
    value: "Remon",
    documents : [ <list with all document _ids of documents that have "field" set to "value">]
}

Таким образом, вы можете делать запросы непосредственно к этой коллекции, чтобы получить все документы, которые «похожи» на ваш исходный документ. Кроме того, это позволяет запрашивать несколько пар ключ / значение с помощью одного запроса O (n).

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

Это помогает?

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