2017-11-27 3 views
0

Betrachten unter Mongo DB 3.2 Dokument,

Clients Sammlung Dokument

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

Auch Dienstleistungen Sammlung Dokumente

{ "_id" : "2tLX8ALYfRvbgiurZ", "name" : "GSTR 1" } 
{ "_id" : "wfE5MqgHfu9QKtK7d", "name" : "GSTR 2" } 
{ "_id" : "MEZtABSEeskuRivXJ", "name" : "GSTR 3" } 

Nun die Werte in services array field in ist verbunden mit _id von Dienstleistungen Kollektion.

Unten ist der Code, den ich gerade ausgeführten bin,

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' 
         } 
     } 
     ] 
    ); 

Ausgabe des obigen Codeausführung ist,

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

Aber Erwartete Ausgabe als unten,

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

Jede Hilfe wird sehr geschätzt.

Antwort

1

können Sie fügen zusätzliche $ group von Ihrem _id mit $ schieben Sie Ihre Dienste in einem Array zu verschmelzen.

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

ich Ihre Hilfe zu schätzen wissen, ich habe zu upvoted, aber ich habe die erwartete Ausgabe geändert, ich, bevor Sie einen Fehler gemacht habe. Danke vielmals. –

0

Hier ist, wie Sie das tun - es gibt keine Notwendigkeit für eine $unwind s ist, solange Sie nicht in Ihrem String über das Produkt, um es egal.

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 
      ] 
     } 
    } 
}]) 

Dies kann jedoch möglicherweise zurückgeben etwas wie das folgende Dokument (beachten Sie die Reihenfolge der Einträge in der Zeichenfolge):

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

Wenn Sie die Einzelteile müssen innerhalb der Zeichenfolge, die Sie sortiert werden kann es auf diese Weise tun:

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 
      ] 
     } 
    } 
}]) 

diese Weise können Sie zuverlässig die Einträge nach Namen sortiert bekommen:

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

Sie können versuchen, concatArrays zu verwenden.

Wie was mickl beantwortet hat, können Sie zuerst gruppieren und es projizieren, um den Array-Wert zu concat.

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

hoffen, es hilft ..

Verwandte Themen