У меня есть простая структура для моих документов:
{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, .....]