Как правильно использовать 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,.populateetc дальнейшая настройка запрос -
.execсообщает Мангусту, что вы закончили настройку запроса, и Мангуст выдает команду DB