MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Mongoose - достъп до вложен обект с .populate

Ето опростена версия на това, което искате.

Основни данни за настройка, първо „учениците“:

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

И след това колекцията "отбори":

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

Ето как го правите:

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

  });

И ви дава резултатите:

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

Наистина не се нуждаете от модула "async", но аз просто имам "навика", така да се каже. Не „блокира“, така че го смятам за по-добър.

Така че, както можете да видите, вие инициирате .populate() call не прави нищо, тъй като очаква да "изключи" _id стойност в чуждата колекция от входен масив, който това "строго погледнато" не е, тъй като "ключът" е на "студент", съдържащ "чуждия ключ".

Наистина разгледах това в скорошен отговор тук , може би не точно за вашата ситуация. Изглежда, че вашето търсене не е показало правилния „същият отговор“ (макар и не точно), от който да се позовавате.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongodb:неуспешно свързване със сървъра при първото свързване

  2. mongodb множество агрегации в една операция

  3. Проблеми с производителността на ограничената колекция

  4. Как да ограничите размера на масив в MongoDB?

  5. Време е да живеете в mongodb, mongoose не работят. Документите не се изтриват