2016-09-10 5 views
2

これは1:N関係の例です。 いくつかの項目(子供)で構成されて1つのルート項目がある:MongoDB子アイテムを1対多の関係で表示する

{ 
    "_id" : ObjectId("52d017d4b60fb046cdaf4851"), 
    "dates" : [ 
     1399518702000, 
     1399126333000, 
     1399209192000, 
     1399027545000 
    ], 
    "dress_number" : "4", 
    "name" : "J. Evans", 
    "numbers" : [ 
     "5982", 
     "5983", 
     "5984", 
     "5985" 
    ], 
    "goals": [ 
     "1", 
     "0", 
     "4", 
     "2" 
    ], 
    "durations": [ 
     "78", 
     "45", 
     "90", 
     "90" 
    ] 
} 

私が何をしたいのかがルートアイテムから子どもたちのデータを表示することです:テーブル構造で

{ 
    "dates": "1399518702000", 
    "numbers": "5982", 
    "goals": "1", 
    "durations: "78" 
}, 
{ 
    "dates": "1399126333000", 
    "numbers": "5983", 
    "goals": "0", 
    "durations": "45" 
}, 
{ 
    "dates": "1399209192000", 
    "numbers": "5984", 
    "goals": "4", 
    "durations": "90" 
}, 
{ 
    "dates": "1399027545000", 
    "numbers": "5985", 
    "goals": "2", 
    "durations": "90" 
} 

ルートアイテム:

name  number 
J. Evans  4 

子供アイテムのようになります。

dates   numbers  goals   durations 
1399518702000  5982   1    78 
1399126333000  5983   0    45 
1399209192000  5984   4    90 
1399027545000  5985   2    90 
私は $unwind演算子を使用して、このような状況を実行しようとしています:

db.coll.aggregate([{ $unwind: "dates" }, { $unwind: "numbers" }, { $unwind: "goals" }, { $unwind: "durations"} ]) 

をしかし、クエリが期待されるデータを与えるものではありません:/ Hereは優れたソリューションですが、2つだけの配列で動作します。

答えて

4

次のパイプラインは、あなたのサンプルについては、以下の出力を生成アイデアを

db.getCollection('yourCollection').aggregate(
    { 
     $unwind: { 
      path: "$dates", 
      includeArrayIndex: "idx" 
     } 
    }, 
    { 
     $project: { 
      _id: 0, 
      dates: 1, 
      numbers: { $arrayElemAt: ["$numbers", "$idx"] }, 
      goals: { $arrayElemAt: ["$goals", "$idx"] }, 
      durations: { $arrayElemAt: ["$durations", "$idx"] } 
     } 
    } 
) 

与えるべき

/* 1 */ 
{ 
    "dates" : NumberLong(1399518702000), 
    "numbers" : "5982", 
    "goals" : "1", 
    "durations" : "78" 
} 

/* 2 */ 
{ 
    "dates" : NumberLong(1399126333000), 
    "numbers" : "5983", 
    "goals" : "0", 
    "durations" : "45" 
} 

/* 3 */ 
{ 
    "dates" : NumberLong(1399209192000), 
    "numbers" : "5984", 
    "goals" : "4", 
    "durations" : "90" 
} 

/* 4 */ 
{ 
    "dates" : NumberLong(1399027545000), 
    "numbers" : "5985", 
    "goals" : "2", 
    "durations" : "90" 
} 
関連する問題