0

私は現在次のような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})

ただし、必要な1つ(またはフィールド)だけではなく、すべての配列が返されます。

Mongoに正しい配列(または配列に関連付けられたフィールド)を取得する方法はありますか?それとも、それは私がサーバー上でしなければならないことですか?結果を取得するためにリチウムフレームワークを使用しています(役立つ場合)。

前もって感謝します :)

ダン

4

1 に答える 1

1

まだコレクションを検索している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:: findhereのドキュメントを参照してください

私の解決策は、キャンペーンの量が少ない場合にユーザーに保持することです(ドキュメントのサイズが大きすぎない限り、PHPでの並べ替えとフィルター処理が高速です)。これが拡大すると予想される場合は、それを独自のモデル/コレクションに移動するか、データをどのようにモデル化したかを再考してください。

于 2011-10-06T11:33:16.623 に答える