sql >> Database >  >> NoSQL >> MongoDB

Mongoose - toegang tot genest object met .populate

Hier is een vereenvoudigde versie van wat je wilt.

Basisgegevens om in te stellen, eerst de "studenten":

{ 
   "_id" : ObjectId("53aa90c83ad07196636e175f"), 
   "name" : "Bill",
   "rollNo" : 1,
   "class" : 12 
},
{ 
    "_id" : ObjectId("53aa90e93ad07196636e1761"),
    "name" : "Ted",
    "rollNo" : 2,
    "class" : 12
}

En dan de collectie "teams":

{ 
    "_id" : ObjectId("53aa91b63ad07196636e1762"),
    "name" : "team1",
    "lead" : "me",
    "students" : [ 
        { 
            "block" : 1,
            "status" : "Y",
            "student" : ObjectId("53aa90c83ad07196636e175f")
        },
        { 
            "block" : 2,
            "status" : "N",
            "student" : ObjectId("53aa90e93ad07196636e1761")
        }
    ]
}

Zo doe je het:

var async = require('async'),
    mongoose = require('mongoose');
    Schema = mongoose.Schema;

mongoose.connect('mongodb://localhost/team');

var teamSchema = new Schema({
  name: String,
  lead: String,
  students: [{
    block: Number,
    status: String,
    student: {
      type: Schema.ObjectId, ref: 'Student'
    }
  }]
});

var studentSchema = new Schema({
  name: String,
  rollNo: Number,
  class: Number
});

var Team = mongoose.model( "Team", teamSchema );
var Student = mongoose.model( "Student", studentSchema );

Team.findById("53aa91b63ad07196636e1762")
  .select('students')
  .exec(function(err, team) {
    console.log( team );

    async.forEach(team.students, function(student,callback) {
      Student.populate(
        student,
        { "path": "student" },
        function(err,output) {
          if (err) throw err;
          callback();
        }
      );
    },function(err) {
      console.log( JSON.stringify( team, undefined, 4 ) );
    });

  });

En het geeft je de resultaten:

{
    "_id": "53aa91b63ad07196636e1762",
    "students": [
        {
            "block": 1,
            "status": "Y",
            "student": {
                "_id": "53aa90c83ad07196636e175f",
                "name": "Bill",
                "rollNo": 1,
                "class": 12
            }
        },
        {
            "block": 2,
            "status": "N",
            "student": {
                "_id": "53aa90e93ad07196636e1761",
                "name": "Ted",
                "rollNo": 2,
                "class": 12
            }
        }
    ]
}

Je hebt de "async"-module echt niet nodig, maar ik ben gewoon "in de gewoonte" als het ware. Het "blokkeert" niet, dus daarom beschouw ik het als beter.

Dus zoals je kunt zien, begin je .populate() oproep doet niets zoals het verwacht een _id te "sleutelen" waarde in de buitenlandse collectie van een array-invoer die "strikt genomen" niet zo is omdat de "sleutel" op "student" staat die de "buitenlandse sleutel" bevat.

Ik heb dit echt behandeld in een recent antwoord hier , misschien niet helemaal specifiek voor uw situatie. Het lijkt erop dat uw zoekopdracht niet het juiste "hetzelfde antwoord" heeft opgeleverd (hoewel niet precies) waaruit u kunt putten.



  1. Verbinding maken met MongoDB vanuit de azure-functie

  2. MongodDB $ slechts één element uit array halen

  3. Hoe bestaande documenten te vervangen bij het importeren van een bestand in MongoDB

  4. Methoden maken om documenten bij te werken en op te slaan met mangoest?