sql >> Databáze >  >> NoSQL >> MongoDB

Mongoose - přístup k vnořenému objektu pomocí .populate

Zde je zjednodušená verze toho, co chcete.

Základní údaje k nastavení, nejprve „studenti“:

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

A pak kolekce "týmy":

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

Uděláte to takto:

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

  });

A dává vám výsledky:

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

Modul "async" opravdu nepotřebujete, ale mám to jen "ve zvyku". "Neblokuje", takže to považuji za lepší.

Jak tedy vidíte, inicializujete .populate() volání nedělá nic, jak očekává, že se "vypne" z _id hodnotu v cizí sbírce ze vstupu pole, kterým tento "přesně řečeno" není, protože "klíč" je na "student" obsahující "cizí klíč".

Opravdu jsem to popsal v nedávné odpovědi zde , možná to není přesně pro vaši situaci. Zdá se, že vaše hledání nenalezlo správnou „stejnou odpověď“ (i když ne přesně), ze které byste mohli odkazovat.



  1. Jak chytím MongoSecurityException?

  2. MongoDB :Jak znásobit pole, které se objevuje pouze v $project?

  3. MongoDB – Maximální velikost souboru pomocí GridFS

  4. Spring Data MongoDB - $eq v rámci podpory $project