MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Mongoose - dostęp do zagnieżdżonego obiektu z .populate

Oto uproszczona wersja tego, czego chcesz.

Podstawowe dane do założenia, najpierw „studenci”:

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

A potem kolekcja „drużyny”:

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

Tak to się robi:

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

  });

I daje wyniki:

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

Naprawdę nie potrzebujesz modułu "async", ale ja po prostu mam zwyczaj. Nie blokuje się, dlatego uważam to za lepsze.

Jak widać, inicjujesz .populate() call nie robi nic, ponieważ oczekuje "klucza" z _id wartość w kolekcji obcej z tablicy wejściowej, której to "ściśle mówiąc" nie jest takie, jak "klucz" jest na "uczniu" zawierającym "klucz obcy".

Naprawdę omówiłem to w ostatniej odpowiedzi tutaj , może niezupełnie specyficzne dla Twojej sytuacji. Wygląda na to, że twoje wyszukiwanie nie przyniosło poprawnej „tej samej odpowiedzi” (choć nie dokładnie), z której możesz czerpać odniesienie.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongo sortuj według pola dynamicznego

  2. Jak znaleźć osadzone dokumenty Mongoid na podstawie wielu kryteriów?

  3. $skip i $limit w ramach agregacji

  4. Node.js + MongoDB :MongoError:kursor zabity lub przekroczony limit czasu

  5. Kiedy powinienem otwierać i zamykać połączenia MongoDB?