Выберите уникальные поля из массива, используя MongoDB - PullRequest
0 голосов
/ 06 октября 2011

У меня есть структура MongoDB, которая в настоящее время выглядит следующим образом:

[campaigns] => Array (
    [0] => Array (
        [campaign_id] => 4e8cba7a0b7aabea08000006
        [short_code] => IHEQnP
        [users] => Array (
        )
    )
    [1] => Array (
        [campaign_id] => 4e8ccf7c0b7aabe508000007
        [short_code] => QLU_IY
        [users] => Array (
        )
    )
)

Я бы хотел иметь возможность искать короткий код и просто возвращать соответствующий массив. Я изначально пробовал:

db.users.find({'campaigns.short_code':'IHEQnP'}, {'campaigns.campaign_id':1})

Однако это возвращает все массивы, а не только тот (или поле), который я хочу.

Есть ли способ в Монго получить правильный массив (или даже поле, связанное с массивом)? Или это то, что я должен был бы сделать на сервере? Я использую литиевые рамки для получения результатов (если это помогает).

Заранее спасибо:)

Dan

1 Ответ

1 голос
/ 06 октября 2011

Когда вы используете критерии, такие как 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, если размер документа не слишком велик). Если ожидается рост, подумайте о том, чтобы перенести его в собственную модель / коллекцию, или подумайте, как вы смоделировали свои данные.

...