Сравнение документов в MongoDB

3

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

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

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

Теги:

1 ответ

0
Лучший ответ

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

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

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

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

Помогает ли это?

  • 0
    Я также посмотрел на создание установки, довольно похожей на это, и надеялся избежать создания дополнительных коллекций для обслуживания, но это больше похоже на маршрут, по которому я должен идти. Спасибо за вклад.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню