1

次のスキーマを持つコレクションがあります。

{ 
    _id: 521cc63c19752c562300001a,
    author: 'John',
    quote: 'A quote',
    type: 1,
    stars:
     [{ _id: 521cc63c19752c562300001b,
       user: 521cc63c19752c5623000003,
       date: Tue Aug 27 2013 16:31:08 GMT+0100 (IST) }]
}

特定の配列内のタイプを持つドキュメントを選択しようとしています。たとえば、タイプが一意の場合、意図したとおりに、各タイプの 3 つの引用符を返します。

db.quotes.aggregate([
    {$match: {
        "type": {
            $in: [1, 2, 3] //The unique types
        }
    }},

    // Group by the type
    {$group: {
        _id: "$type",
        id: { $first: "$_id" },
        author: { $first: "$author" },
        stars: { $first: "$stars" },
        description: { $first: "$description" }
    }},

    // Map/project the first result of each group
    // to their respective keys
    {$project: {
        _id: "$id",
        type: "$_id",
        author: "$author",
        description: "$description"
        stars: "$stars"
    }}
]);

私の問題は、型が常に一意であるとは限らないことです。同じタイプ ([1, 1, 1]) の 3 つのドキュメント、または同じタイプの 2 つのドキュメントと 1 つの一意のドキュメント ([1, 2, 2]) を見つける必要があります。この状況が発生すると、$group by type パイプライン コマンドにより、1 つまたは 2 つの結果しか返されません。一意でない 3 つのタイプを提供し、各タイプの 3 つの見積もりを常に取得する方法について何かアドバイスはありますか?

4

1 に答える 1

0

次のような独自の関数を作成する必要があります。

  • タイプ配列を引数として取ります。
  • 空のskipDocsハッシュ/オブジェクトをインスタンス化します。

    var objSkipDocs = {};

  • タイプ配列の各要素について、ハッシュ内のその値のキーをゼロ化します。

    for (var i = 0; i < arrayTypes.length; i++) { objSkipDocs[arrayTypes[i]] = 0; }

  • タイプ配列の各要素について、ドキュメントの取得を試みます。

    db.quotes.findOne({'type': arrayTypes[i] }).skip( objSkipDocs[ arrayTypes[i] ] );

    objSkipDocs[arrayTypes[i]] += 1;

  • 取得した文書で何かをする

于 2013-11-03T11:02:09.523 に答える