2017-03-07 5 views
1

$unwind 2 fields separately in mongodb queryとほぼ同じMongoDB集約クエリに関する質問があります。MongoDBは2つの埋め込み配列を別々に解きます

これはドキュメントです:

{ 
    "_id" : "1", 
    "details" : { 
     "phonenumber" : [ 
      "1", 
      "2" 
     ], 
     "name" : [ 
      "a", 
      "b" 
     ] 
    } 
} 

そして私は私に次の結果を返します。クエリをフレームにしようとしています:

{ "_id" : "1", "phonenumber" : "1", "name" : null }, 
{ "_id" : "1", "phonenumber" : "2", "name" : null }, 
{ "_id" : "1", "phonenumber" : null, "name" : "a" }, 
{ "_id" : "1", "phonenumber" : null, "name" : "b" } 

は、誰かがそれで私を助けていただけますか?

db.document.aggregate([ { $unwind: { path: "$details.name"} }, { $unwind: { path: "$details.phonenumber" } }, { $project: { _id: 1, name: "$details.name", phonenumber: "$details.phonenumber" } } ]) 

とクエリの上からの出力は次のとおりです:私は把握でき

最寄の解決策は、クエリに従うことであるMongoDB v3.4

{ "_id" : "1", "phonenumber" : "1", "name" : "a" }, 
{ "_id" : "1", "phonenumber" : "1", "name" : "b" }, 
{ "_id" : "1", "phonenumber" : "2", "name" : "a" }, 
{ "_id" : "1", "phonenumber" : "2", "name" : "b" } 
+0

あなたはあなたのコレクション内のドキュメントの完全な例を与えることができますか?あなたの試みでは、あなたは '$ details.email'を持っています。 –

+0

集約パイプラインはシーケンシャルです。 1つのステージの出力が別のステージの入力になります。あなたがしようとしているのは、最初のデータを2つの段階に分岐することです。それは不可能です。 – RaR

+0

@ᵈˑᵈˑ私は質問で「名前」の「email」フィールドを編集しました。それはタイプミスでした。 –

答えて

1

、可能な解決策の一つは次のようになり、

db.document.aggregate({ 
    '$facet': { 
     'phonenumber': [{ 
      '$unwind': '$details.phonenumber' 
     }, { 
      '$project': { 
       phonenumber: '$details.phonenumber', 
       name: null 
      } 
     }], 
     'name': [{ 
      '$unwind': '$details.name' 
     }, { 
      '$project': { 
       name: '$details.name', 
       phonenumber: null 
      } 
     }] 
    } 
}, { 
    '$project': { 
     'combined': { 
      '$setUnion': ['$phonenumber', '$name'] 
     } 
    } 
}, { 
    '$unwind': '$combined' 
}, { 
    '$replaceRoot': { 
     'newRoot': '$combined' 
    } 
}) 

facetバージョン3.4

1

のMongoDBの以前のバージョンの代替ソリューションから入手可能である単一のステージ、内リュド複数の集約パイプラインは、

db.document.aggregate([{ 
     $unwind: { 
      path: "$details.name" 
     } 
    }, { 
     $group: { 
      _id: "$_id", 
      nameArr: { 
       $push: { 
        name: "$details.name", 
        phonenumber: { 
         $ifNull: ["$description", null] 
        } 
       } 
      }, 
      "details": { 
       $first: "$details" 
      } 
     } 
    }, { 
     $unwind: "$details.phonenumber" 
    }, { 
     $group: { 
      _id: "$_id", 
      phoneArr: { 
       $push: { 
        phonenumber: "$details.phonenumber", 
        name: { 
         $ifNull: ["$description", null] 
        } 
       } 
      }, 
      "nameArr": { 
       $first: "$nameArr" 
      } 
     } 
    }, { 
     $project: { 
      _id: 1, 
      value: { 
       $setUnion: ["$nameArr", "$phoneArr"] 
      } 
     } 
    }, { 
     $unwind: "$value" 
    }, { 
     $project: { 
      name: "$value.name", 
      phonenumber: "$value.phonenumber" 
     } 
    }]) 
+0

これも動作します!ありがとう:) –

関連する問題