2016-10-13 3 views
1

Ich möchte ein Dokument aus mongodb abzurufen und wandeln sie dann ein flaches Objekt oder flach array.So können sagen, dass ich dieses Dokument habe:Convert Mungo Dokument zu flachen Gegenstand

{ 
    "_id":"57db3e2269d84bfc06ccecef", 
    "profileId": { 
     "_id":"57d838072902f1280324cc8d", 
     "fname":"name", 
     "lname":"name2" 
    }, 
    "subjectId": { 
     "_id":"57a0d71fb62eaf002e1258c2", 
     "title":"Some Title 
    }, 
    "comments": [{ 
     "_id":"57db3f046a8dde181a4cce65", 
     "text":"fggg" 
    }], 
    "type":"post", 
    "text":"dddddddddddddddddddddd", 
    "datetime":"2016-09-16T00:34:42.888Z" 
} 

Und ich will es konvertieren dies wie (kann sagen, dass ich nicht mehr die IDs des Profils und subjectId muß don `t):

{ 
    "_id":"57db3e2269d84bfc06ccecef", 
    "fname":"name", 
    "lname":"name2", 
    "title":"Some Title, 
    "comments":[ 
     "text":"fggg" 
    ], 
    "type":"post", 
    "text":"dddddddddddddddddddddd", 
    "datetime":"2016-09-16T00:34:42.888Z" 
} 

Antwort

0

Ich denke, dass mit so etwas wie getan werden könnte:

let myObj = {}; 
for(var key in myDocument) { 
    switch(typeof myDocument[key]) { 
     case 'object': 
      if(!Array.isArray(myDocument[key])){ 
        myObj[key] = {}; 
        for(var objKey in myDocument[key]) { 
        if(objKey !== "_id") { 
        myObj[key][objKey] = myDocument[key][objKey]; 
        } 
        } 
        break; 
      } else { 
        let arr = []; 
        myDocument[key].forEach(function(el) { 
        if(typeof el == 'object') { 
         for(var elKey in el) { 
         if(elKey !== '_id') { 
          arr.push(el); 
         } 
         } 
        } 
        }); 
        myObj[key] = arr; 
        break; 
       } 
     default: 
        myObj[key] = myDocument[key]; 
    } 
} 

Ich habe es ausprobiert und gibt mir diese:

myObj = { _id: '57db3e2269d84bfc06ccecef', 
    profileId: { fname: 'name', lname: 'name2' }, 
    subjectId: { title: 'Some Title' }, 
    comments: [ { _id: '57db3f046a8dde181a4cce65', text: 'fggg' } ], 
    type: 'post', 
    text: 'dddddddddddddddddddddd', 
    datetime: '2016-09-16T00:34:42.888Z' } 

Aber diese Antwort könnte mayb optimiert werden e weil dies für eine sehr genaue Annäherung ist

0

Es gibt viele tragfähige Lösungen sind. Einige sind dynamischer, einige ziemlich hart codiert. Es hängt von der Komplexität des Problems ab, was am Ende besser ist. Da Sie nicht alle Elemente einschließen möchten, besteht die einfachste Möglichkeit darin, dieses Objekt selbst zu erstellen.

// mngObject is coming from mongoose. 

mngObject.fname = mngObject.profileId.fname 
// and so on 

// At the end 
delete mngObject.profileId; 
0

Werfen Sie einen Blick auf MongoDB Aggregation Framework.

So etwas könnte den Trick tun:

db.<collection>.aggregate([ 

    // reformat all except comments 
    {$project: { 
    _id: '$_id', 
    fname: '$profileId.fname', 
    lname: '$profileId.lname', 
    title: '$subjectId.title', 
    comments: '$comments', 
    type: '$type', 
    text: '$text', 
    datetime: '$datetime' 
    }}, 

    // unwind comments 
    {$unwind: '$comments'}, 

    // re-formate with comments 
    {$group: { 
    _id: '$_id', 
    fname: {$first: '$fname'}, 
    ... 
    comments: {$push: '$comments.text'} 
    }} 
]) 

Es ist möglich, die gleiche Sache nur mit den $unwind und $group Stufen zu erreichen, aber ich hinzugefügt, um die $project Bühne zu zeigen, was es tun kann.


Oder schreiben Sie einfach ein Skript:

db.<collection>.find(function(err, docs) { 

    if (err) { 
    // handle error 
    } 

    // reformat docs 
    var reshapedDocs = []; 
    docs.forEach(function(doc) { 
    var reshapedDoc = {}; 
    reshapedDoc.fname = doc.profileId.fname; 
    // ... 
    reshapedDoc.comments = []; 
    doc.comments.forEach(function(comment) { 
     reshapedDoc.comments.push(comment.text); 
    }); 
    // ... 
    reshapedDocs.push(reshapedDoc); 
    }); 

}); 
Verwandte Themen