sql >> Database teknologi >  >> NoSQL >> MongoDB

Mongoose - får adgang til indlejret objekt med .populate

Her er en forenklet version af, hvad du ønsker.

Grundlæggende data til opsætning, først "studerende":

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

Og så "hold"-samlingen:

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

Sådan gør du:

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

  });

Og det giver dig resultaterne:

{
    "_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
            }
        }
    ]
}

Du behøver virkelig ikke "async"-modulet, men jeg er bare "vane" som det var. Det "blokerer" ikke, så derfor anser jeg det for bedre.

Så som du kan se, starter du .populate() opkaldet gør ikke noget, da det forventer at "nøgle" fra et _id værdi i den fremmede samling fra et array-input, som dette "strengt taget" ikke er, da "nøglen" er på "elev", der indeholder "fremmednøglen".

Jeg dækkede virkelig dette i et nyligt svar her , måske ikke ligefrem specifik for din situation. Det ser ud til, at din søgning ikke viste det rigtige "samme svar" (dog ikke nøjagtigt), som du kan trække referencer fra.



  1. Nodejs paginering

  2. redis dump.rdb / gemmer små filer

  3. er procedure findes i mongodb

  4. duplikere en samling ind i sig selv