Подсчет совпадений вложенных документов в монго-документе - PullRequest
0 голосов
/ 30 июня 2011

У меня есть простая структура для моих документов:

{regId: 1, data: {[{val: 123456}, {val: 324234}, {val: 4353453}, .......]}}

Массив элементов данных может содержать от 30 до 60 поддокументов, и в настоящее время собрание содержит ~ 53000 документов, но будет расти намного больше.

Учитывая массив значений, INPUT, [11563012,11563011,82867218,83866648, ....], Я хочу вернуть документы, которые имеют как минимум 3 соответствующих data.val. В настоящее время я выполняю запрос с использованием модификатора $ in и предложения $ where, которое вызывает js функция (countMatches). Модификатор $ in возвращает любой документ, который содержит хотя бы один элемент для IMPUT, а функция $ where перебирает каждый document.date, подсчитывая совпадения в INPUT и возвращает только документы, превышающие пороговое значение:

db.foo.find({"data.val": {$in: [11563012,11563011,82867218,83866648,.......]}, $where: "countMatches(this.data, [11563012,11563011,82867218,83866648,......])>=3"}).count();

Подобные вопросы (http://groups.google.com/group/mongodb-user/browse_thread/thread/fa291575fd47c010), похоже, указывают, что единственный способ подсчета совпадений в «поддокументах» - это либо с функцией js в предложении $ where, либо с агрегатной функцией group ().

Тогда у меня вопрос: есть ли лучший способ подсчета "совпадений" в поддокументе? Это семантически похоже на поиск «помеченных» документов, то есть возвращает документы, которые имеют наиболее подходящие теги [tag1, tag2, tag3, tag4, .....]

1 Ответ

0 голосов
/ 07 июля 2011

Вы должны использовать $where, лучшего способа сделать это не существует.

Имейте в виду, что если ваш $in фильтр вернет большую часть коллекции, вы не сможете масштабировать с этим решением ... (и будет трудно масштабировать с любым другим решением)

...