Во-первых, я бы не стал хранить это в объекте пользователя.У объектов MongoDb верхний предел составляет 4/16 МБ (в зависимости от версии).Теперь этот предел обычно не является проблемой, но при входе в систему в одном объекте вы можете достичь его.Однако более реальная проблема заключается в том, что каждый раз, когда вам нужно воздействовать на эти объекты, вам нужно загрузить их в оперативную память, и это становится потребляющим.Я не думаю, что вы хотите, чтобы на ваших пользовательских объектах.
Во-вторых, массивы в объектах не сортируются и имеют другие ограничения, которые могут вернуться к вам позже.
Но, если вы хотите иметьэто так (небольшой объем поисков не должен быть проблемой на самом деле), вы можете решить эту проблему проще всего, используя групповой запрос.Групповой запрос во многом похож на групповой запрос в SQL, так что это небольшая хитрость, так как вам нужно сгруппировать что-то, что разделяет большинство объектов.(Возможно, активное поле для пользователей).
Итак, вот пример рабочей группы, которая будет суммировать слова, используемые на основе вашей структуры.Просто поместите этот метод в вашу модель и выполните MyModel :: searchTermUsage (), чтобы вернуть объект Document.
public static function searchTermUsage() {
$reduce = 'function(obj, prev) {
obj.terms.forEach(function(terms) {
terms.forEach(function(term) {
if (!(term in prev)) prev[term] = 0;
prev[term]++;
});
});
}';
return static::all(array(
'initial' => new \stdclass,
'reduce' => $reduce,
'group' => 'common-value-key' // Change this
));
}
В поле term нет защиты от типов, не являющихся массивами(у вас было нулевое значение в вашем примере).Я удалил его для простоты, лучше удалить его, прежде чем он попадет в базу данных.