2017-11-27 8 views
0

モンゴDB 3.2ドキュメント、

クライアントコレクションドキュメント

{ 
    "_id" : "gcJk4eRRo2WCbgWSL", 
    "services" : [ 
     "2tLX8ALYfRvbgiurZ", 
     "wfE5MqgHfu9QKtK7d", 
     "MEZtABSEeskuRivXJ" 
    ] 
} 

また、サービスコレクションドキュメント

{ "_id" : "2tLX8ALYfRvbgiurZ", "name" : "GSTR 1" } 
{ "_id" : "wfE5MqgHfu9QKtK7d", "name" : "GSTR 2" } 
{ "_id" : "MEZtABSEeskuRivXJ", "name" : "GSTR 3" } 
の下に考えてみた値とIDの配列を置き換えます

今、の値配列フィールドクライアントは、_idサービスに関連付けられています。以下は

は、

{ "_id" : "gcJk4eRRo2WCbgWSL", "services" : "GSTR 1" } 
{ "_id" : "gcJk4eRRo2WCbgWSL", "services" : "GSTR 2" } 
{ "_id" : "gcJk4eRRo2WCbgWSL", "services" : "GSTR 3" } 

しかし、予想される出力は以下の通りです、私は、現在実行していたコード、上記のコード実行の

db.getCollection('Clients').aggregate(
     [ 
     { "$unwind" : { path: "$services"}}, 
     { 
      "$lookup" : { from: "Services", localField: "services", foreignField: "_id", as: "services" } 
     }, 
     { "$unwind" : { path: "$services", preserveNullAndEmptyArrays: true }}, 
     { "$project" : { 
          _id : 1, services: '$services.name' 
         } 
     } 
     ] 
    ); 

出力がある

{ 
    "_id" : "gcJk4eRRo2WCbgWSL", 
    "services" : "GSTR 1, GSTR 2, GSTR 3" 
} 

どんな助けも高く評価されます。 $が1列にあなたのサービスをマージするを押すと

答えて

1

あなたは_idによって追加$グループを追加することができます。あなたは、文字列内の項目の順序を気にしない限り、任意の$unwindのための必要はありません - あなたはそれを行う方法をここで

db.Clients.aggregate(
    [ 
    { "$unwind" : { path: "$services"} }, 
    { 
     "$lookup" : { from: "Services", localField: "services", foreignField: "_id", as: "services" } 
    }, 
    { "$unwind" : { path: "$services", preserveNullAndEmptyArrays: true }}, 
    { "$project" : { 
         _id : 1, services: '$services.name' 
        } 
    }, 
    { 
     "$group": { 
     _id: "$_id", 
     "services": { "$push": "$services"} 
     } 
    } 
    ] 
); 
+0

...それが役に立てば幸い、私はあまりにもupvotedているが、私は期待される出力を変更して、私は前にミスをしました。どうもありがとう。 –

0

です。

db.getCollection('Clients').aggregate([ 
{ 
    "$lookup": { 
     from: "Services", 
     localField: "services", 
     foreignField: "_id", 
     as: "services" 
    } 
}, { 
    "$project": { 
     "_id" : 1, 
     "services": { 
      $substr: 
      [ 
       { 
        $reduce: { // transform array of strings into concatenated string 
         input: '$services.name', 
         initialValue: '', 
         in: { 
          $concat: ['$$value', ', ', '$$this'] 
         } 
        } 
       }, 
       2, // remove first two characters as they will be ', ' 
       -1 
      ] 
     } 
    } 
}]) 

これは、しかし、潜在的に以下の文書(文字列内のエントリの順序に注意してください)のようなものを返すことができます:あなたは、文字列内の項目はあなたをソートする必要がある場合は

{ 
    "_id" : "gcJk4eRRo2WCbgWSL", 
    "services" : "GSTR 1, GSTR 3, GSTR 2" 
} 

をあなたは確実にエントリを名前でソートします

db.getCollection('Clients').aggregate([ 
{ 
    "$lookup": { 
     from: "Services", 
     localField: "services", 
     foreignField: "_id", 
     as: "services" 
    } 
}, { 
    $unwind: "$services" // flatten the services array 
}, { 
    $sort: { 
     "services.name": 1 // sort all documents by service name 
    } 
}, { 
    $group: { // group the everything back into the original structure again 
     "_id": "$_id", // we want one group per document id 
     "services": { 
      $push: "$services" // and all its services in an array - this time reliably sorted! 
     } 
    } 
}, { 
    "$project": { 
     "_id": 1, 
     "services": { 
      $substr: 
      [ 
       { 
        $reduce: { // transform array of strings into concatenated string 
         input: '$services.name', 
         initialValue: '', 
         in: { 
          $concat: ['$$value', ', ', '$$this'] 
         } 
        } 
       }, 
       2, // remove first two characters as they will be ', ' 
       -1 
      ] 
     } 
    } 
}]) 

この方法:

、このようにそれを行うことができます0
{ 
    "_id" : "gcJk4eRRo2WCbgWSL", 
    "services" : "GSTR 1, GSTR 2, GSTR 3" 
} 
1

concatArraysを試すことができます。

micklが回答したように、まずグループ化して配列値を連結するように投影できます。

//previous code 
{ 
    "$group": { 
    _id: "$_id", 
    "services": { "$push": "$services"} 
    } 
},{ $project: { 
     _id : "$_id", 
     "services": { $concatArrays: [ "$services" ] } } 
} 

は、私はあなたの助けに感謝