1

私は自分の問題とここで何が欲しいかを説明するために簡単な要点を設定しようとしました。

それは間違いなく私の正確なドキュメント構造(まったく異なる)を複製しませんが、私の問題を簡単に理解するのに役立ちます。

アップデート:

要旨が誤って削除されたため、問題を含む質問を更新します。

私がこの構造を持っているとしましょう

    _id  name  birthdate
    ...  john  10 aug
    ...  doe   11 aug
    ...  foo   11 aug
    ...  bar   12 aug
    ...  baz   12 aug
    ...  bak   12 aug
    ...  buzz  13 aug

同じ誕生日を共有するすべてのドキュメントを検索したいので、結果セットは次のようになります。

    _id  name  birthdate
    ...  doe   11 aug
    ...  foo   11 aug
    ...  bar   12 aug
    ...  baz   12 aug
    ...  bak   12 aug

また、どういうわけか、各ドキュメントに対する日付共有レコードのcount()を取得したいと思います。だから、このようなもの

    _id  name  birthdate  count
    ...  doe   11 aug     2
    ...  foo   11 aug     2
    ...  bar   12 aug     3
    ...  baz   12 aug     3
    ...  bak   12 aug     3

今まで私が試したのはmapReduceだけですが、それでは次のものしか取得できませんでした。

    _id     value
    11 aug  {count: 2}
    12 aug  {count: 3}
4

1 に答える 1

3

MongoDB 2.2の新しいAggregation Frameworkを使用すると、より簡単に結果を得ることができます。

以下の例では MongoDB シェルを使用していますが、同様のアプローチが Mongoid からも機能します。

データが次のように設定されていると仮定します。

db.users.insert({'name': 'john', 'birthdate':'10 aug'});
db.users.insert({'name': 'doe',  'birthdate':'11 aug'});
db.users.insert({'name': 'foo',  'birthdate':'11 aug'});
db.users.insert({'name': 'bar',  'birthdate':'12 aug'});
db.users.insert({'name': 'baz',  'birthdate':'12 aug'});
db.users.insert({'name': 'bak',  'birthdate':'12 aug'});
db.users.insert({'name': 'buzz', 'birthdate':'13 aug'});

以下は、aggregate コマンドのコメント付きの例です。

db.users.aggregate(
    // Group and count documents by same birthdate
    { $group: {
        '_id' : '$birthdate',
        'name': { $addToSet: '$name' },
        'count': { $sum: 1 },
    }},

    // Only match documents with at least one duplicate
    { $match : {
        'count' : { $gt: 1 }
    }},

    // Unwind the grouped documents so there is one per name
    { $unwind : '$name' },

    // Sort results by _id and name
    { $sort : {
        '_id': 1,
        'name': 1,
    }}
)

.. そして結果:

{
    "result" : [
        {
            "_id" : "11 aug",
            "name" : "doe",
            "count" : 2
        },
        {
            "_id" : "11 aug",
            "name" : "foo",
            "count" : 2
        },
        {
            "_id" : "12 aug",
            "name" : "bak",
            "count" : 3
        },
        {
            "_id" : "12 aug",
            "name" : "bar",
            "count" : 3
        },
        {
            "_id" : "12 aug",
            "name" : "baz",
            "count" : 3
        }
    ],
    "ok" : 1
}
于 2012-09-11T13:20:34.490 に答える