Я хочу сравнить поля между потенциально миллионами документов внутри коллекции mongo. Поля будут определены заранее и весы будут переданы каждому полю. Эти веса затем будут использоваться для возврата пар документов, представляющих предложения для "похожих" документов. Например, если сравнивать два документа и оба имеют одинаковое значение для поля "first_name", таблица весов будет называться, и оценка для пары будет иметь этот вес, добавленный к ней. Если другое поле будет одинаковым между двумя, оценка будет обновлена, чтобы отобразить более высокое сходство.
В настоящее время я приближаюсь к этому путем итерации через начальный набор результатов, а затем с встроенной итерацией, которая также проходит через набор результатов и сравнивает каждый документ с документом, в котором включен первый итератор (крайне неэффективно). В настоящее время это делается php, поскольку он захватывает элементы через курсор.
Я открыт для любых предложений, в том числе реализаций MapReduce (на самом деле не кажется им применимым), манипуляции с курсором, почти все, что вы можете вызвать, чтобы упростить процесс, потому что im работает с функцией O (n ^ 2) прямо сейчас ( Ну, немного лучше, поскольку я пропускаю документы, которые были рассмотрены до сих пор первым итератором).
Чтобы избежать n ^ 2, вам нужно будет посмотреть на сохранение полей и их значений в контрольной коллекции, например.
{
field: "firstName",
value: "Remon",
documents : [ <list with all document _ids of documents that have "field" set to "value">]
}
Таким образом вы можете напрямую запросить эту коллекцию, чтобы получить все документы, которые похожи на ваш исходный документ. Кроме того, это позволяет вам запрашивать несколько пар ключ/значение с одним запросом O (n).
Очевидно, единственная сложная задача - сохранить эту справочную коллекцию в первую очередь, но в вашем случае это выглядит довольно просто (обновлять ссылки при обновлении полей).
Помогает ли это?