1

1 つのレコードを持つ mongo コレクションを非集約化し、内部に 1 つの大きな大きなリストを持ち、代わりに別のコレクションの多くのレコードとして表現したいと考えています。long 配列に含まれていないレコード内の変数の場合、これは、新しいコレクションにコピーされるたびに、arary の上の各新しいレコードに最上位レベルを繰り返すことを意味します。

私が持っているのはこれです:

> db.current.showOne()
{"name" : "thing",
"othervar" : 1,
"longcollection" : [
                    {"first": 1,
                     "second":2},
                    {"first": 3,
                     "second":4},
                    {"first": 5,
                     "second":6},
                    ... etc...
                    {"first": 10000,
                     "second":10001}
                    ]
}

私が欲しいのはこれです:

> db.new.find().limit(5000).pretty()
{"name" : "thing",
"othervar" : 1,
"longcollection" :
                    {"first": 1,
                     "second":2}
},
{"name" : "thing",
"othervar" : 1,
"longcollection" :
                    {"first": 3,
                     "second":4}
},
{"name" : "thing",
"othervar" : 1,
"longcollection" :
                    {"first": 5,
                     "second":6}
},

{"name" : "thing",
"othervar" : 1,
"longcollection" :
                    {"first": 7,
                     "second":8}
}

..等。

各レコードに固有の情報は "longcollection" 変数にあり、これは配列ではなく辞書になっています。"longcollection" の内部ではなく、同じレベルにあるその他の情報は、すべての新しいレコードに対して繰り返されます。

これは一種のアンラップ、またはアンワインドだと思います。ここで私を得る copyTo() と unwrap/aggregation の構文の組み合わせは何ですか? 私は、mongodb の JavaScript と集計の面ではまだ新しいものです。

4

1 に答える 1

4

単純な$unwindでこれを行うことができるはずです

上記の例では、次を使用できます。

db.current.aggregate({$unwind: "$longcollection"})

これにより、次のような結果が得られます。

{
    result: : [
        {
            "_id" : ObjectId(...),
            "name": xxxx,
            "othervar": yyyyy,
            "longcollection" : {
                "first": 1, 
                "second":2
            }
        },
        {
            "_id" : ObjectId(...),
            "name": yyyy,
            "othervar": zzzz,
            "longcollection" : {
                "first": 3, 
                "second":4
            }
        }],
        "ok" : 1
}

コメントに表示される重複した _id メッセージを停止するには、次を使用できるはずです。

db.current.aggregate({$project : {_id: 0, name: 1, othervar: 1, longcollection: 1}}, {$unwind: "$longcollection"})
于 2013-08-12T09:20:20.713 に答える