Как правильно использовать 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