2016-03-28 8 views
1

Ich habe das folgende vereinfachte Dokument aus der Sammlung „main“:Mongoose.js - verschiedene Bevölkerung als üblich

{ 
    _id: 5, 
    menuItems: [an array of elements here], 
    menuProperties: {an object here} 
} 

:

{ 
    _id: 120, 
    name: "Main1", 
    prop1: "val", 
    menuId: 5 
} 

Hier ein vereinfachtes Dokument aus meiner „Menü“ Sammlung ist es möglich, mit mongoose.js das „Menü“ Dokument in die „main“ Dokument in einer solchen Art und Weise zu füllen, die das folgende Modellobjekt führen wird:

{ 
    _id: 120, 
    name: "Main1", 
    prop1: "val", 
    menuItems: [an array of elements here], 
    menuProperties: {an object here} 
} 

Was kann ich erreichen, ist jetzt:

{ 
    _id: 120, 
    name: "Main1", 
    prop1: "val", 
    menuId: { 
       menuItems: [an array of elements here], 
       menuProperties: {an object here} 
      } 
} 

Ich habe nicht die Regelungen hinzugefügt, da sie sehr einfach sind und ref für die menuId enthalten wird. Danke!

Antwort

1

Eine Möglichkeit besteht darin, das menuId aus dem Populationsergebnis zu entfernen und menuItem und menuProperties zum Populationsergebnis hinzuzufügen. Hier sind die Beispielcodes,

Main.find() 
    .populate('menuId', 'menuItem menuProperties -_id', 'Menu') 
    .exec(function(err, docs){ 
     if (err) 
      console.log(err); 
     else { 
      var rets = []; 
      docs.forEach(function(doc) { 
       // converts the mongoose document into a plain javascript object 
       doc = doc.toJSON(); 
       // add menuItem key 
       if (doc.menuId && doc.menuId.menuItem) { 
        doc.menuItem = doc.menuId.menuItem; 
       } 
       // add menuProperties key 
       if (doc.menuId && doc.menuId.menuProperties) { 
        doc.menuProperties = doc.menuId.menuProperties; 

        // remove the menuId object 
        delete doc.menuId 
       } 
       rets.push(doc); 
      }); 

      console.log(rets); 
     } 
    }); 

Test mit Schema

var MainSchema = new mongoose.Schema({ 
    name: String, 
    prop1: String, 
    menuId: Number 
}); 

var MenuSchema = new mongoose.Schema({ 
    _id: Number, 
    menuItem: [String], 
    menuProperties: {k: String} 
}); 

var Main = mongoose.model('Main', MainSchema); 
var Menu = mongoose.model('Menu', MenuSchema); 

und die Ergebnisse sind

[ { _id: 56fa39b4924d1254272ac3f1, 
    name: 'main1', 
    prop1: 'val', 
    __v: 0, 
    menuItem: [ 't1', 't2' ], 
    menuProperties: { k: 'p1' } } ] 
+1

Danke für die Antwort, ich denke, dass anstelle von 'doc.toJSON();' können Sie hinzufügen '.lean()' vor dem '.exec()' Anruf – TBE

+0

@ TBE, guten Fang .... – zangw

2

Es gibt viele Möglichkeiten, dies zu tun. Man könnte immer so etwas wie dies tun (beachten Sie, Sie haben Post nicht Ihre Schemata so dass ich die Namen aus):

//get every document in menu collection 
Menu.find({}).exec(function(err,all_menuItems){ 

    if (err) {throw err}; 

    //for all documents in them meny collection 
    //find docuement in main collection and update 

    all_menuItems.forEach(function(item){ 

     //wrapping in closure since doing forEach over async function 
     function(){ 

      Main.findOne({_id:item._id}).exec(function(err,mainItem){ 

      if (err) {throw err}; 

      //set properties 
      mainItem.menuItems = item.menuItems; 
      menuItem.menuProperties = item.menuProperties; 
      //save document 
      Main.save(mainItem) 

      }) 

     }(item) 
    }) 

}) 

Auch Mungo als in bevöl Verfahren gebaut, die verwendet werden können, dies zu tun. Sie finden diese Dokumentation hier. http://mongoosejs.com/docs/populate.html.

Die Verwendung von Populate wäre wahrscheinlich eine viel bessere Option als das Umlaufen einer Reihe von Async-Aufrufen (oder das Neuschreiben des obigen Codes, um die Aktualisierungen synchron zu verarbeiten). Aber Sie können mit jedem Weg umgehen, der für Ihre Datenbank am sinnvollsten ist.

+0

Danke für die Mühe, aber ich brauche das 'menu' Dokument in die aufgefüllt werden Hauptdokument. Ich brauche auch die 'menu' Eigenschaften auf dem gleichen Level wie die' main' Eigenschaften – TBE

+0

Der obige Code durchläuft alle Menü-Dokumente. Für jedes Menüdokument findet es das passende Hauptdokument. Es füllt dann das Hauptdokument mit den Menüdokumentinformationen auf. Willst du das nicht? – user2263572

Verwandte Themen