Когда вы используете критерии, такие как campaigns.short_code , вы все еще ищете собрание, кампания - это просто свойство документа, ваша находка возвращает документы.
Поэтому, учитывая эту структуру, вы не можете достичь того, что вы хотите, напрямую с помощью запроса.
Массивы в MongoDb можно нарезать, но не сортировать:
db.users.find({}, {campaigns: { $slice : 1}})
Это даст вам первую кампанию, но, поскольку вы не можете ее отсортировать, IHEQnP находится на вершине, это не поможет в этой ситуации.
Подробнее здесь .
Однако вы можете отфильтровать это довольно просто в Lithium после получения полного документа:
$id = 'id to match against';
$result = $user->campaigns->find(function($model) use ($id) {
return $model->campaign_id === $id
});
См. Документы для Entity :: find здесь
Мое решение состояло бы в том, чтобы сохранить его в Пользовательском, если количество кампаний невелико (быстрая сортировка и фильтрация в PHP, если размер документа не слишком велик).
Если ожидается рост, подумайте о том, чтобы перенести его в собственную модель / коллекцию, или подумайте, как вы смоделировали свои данные.