Как правильно использовать populate с Мангустом?

Я изучаю какой-то узел и пытаюсь использовать мангуста. В настоящее время моя цель-научиться использовать заполнить.

у меня есть projects определение и milestone требуется:

projectSchema = new mongoose.Schema({
    id: String,
    title: String,
    description: String,
    owner: String,
    site: String,
    creation_date: Date,
    milestone_ids: Array,
    milestones: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: "Milestone"
    }]
})

Project = mongoose.model("Project", projectSchema)
milestones = require(__dirname + "/milestones.js")();

затем я делаю это в какой-то момент projects.js:

Project.find(query, {}, {sort: {_id: -1}},
    function (error, results) {
        callback(results);
    }
).populate("milestones");

как мне заполнить вехи?


здесь project данные из монго:

{
    "title": "sitename",
    "description": "online thing",
    "creation_date": {
        "$date": "2013-07-11T19:45:42.139Z"
    },
    "_id": {
        "$oid": "51df0b66dbdd7c4f14000001"
    },
    "milestones": [],
    "milestone_ids": [],
    "__v": 0
}

и milestone это в основном подключено к проекту:

{
    "title": "Proof of concept",
    "description": "Make it work.",
    "due_date": {
        "$date": "2013-07-11T19:46:38.535Z"
    },
    "project_id": "51df0b66dbdd7c4f14000001",
    "_id": {
        "$oid": "51df0b9edbdd7c4f14000002"
    },
    "__v": 0
}

кроме того, это схема milestone:

milestoneschema = new mongoose.Schema({
    id: String,
    title: String,
    description: String,
    owner: String,
    site: String,
    due_date: Date,
    project_id: {
        type: String,
        ref: "Project"
    }
})

Milestone = mongoose.model("Milestone", milestoneschema);

1 ответов


вам нужно получить право заказа на определение параметров запроса, а затем выполнение, и цепные API, такие как запрос мангуста, не могут знать, какие дополнительные методы вы можете вызвать после запуска запроса. Поэтому, когда вы передаете обратный вызов .find, Мангуст отправляет запрос сразу.

передать обратный вызов find

  • запрос, определенный аргументами в find
  • поскольку обратный вызов существует, запрос немедленно выполняет и выдает команду DB
  • затем .populate случается, но это не имеет никакого эффекта, поскольку запрос уже отправлен в mongo

вот что вам нужно сделать:

Project.find(query, {}, {
    sort: {
        _id: -1
    }
}).populate("milestones").exec(function (error, results) {
    callback(results);
});

или немного более читаемым:

Project
    .find(query)
    .sort('-_id')
    .populate('milestones')
    .exec(function(error, results) {                  
        callback(results);
    });

опустить обратный вызов и использовать .exec

  • запрос передан .find создает объект запроса с параметрами
  • дополнительные прикованные вызовы .sort, .populate etc дальнейшая настройка запрос
  • .exec сообщает Мангусту, что вы закончили настройку запроса, и Мангуст выдает команду DB