如何使用 mongoose populate 获取另一个集合数据
How to get another colletion data with mongoose populate
我在节点 js 中有以下模型,我想在一次调用中从文件模式和客户端模式获取数据,我正在阅读有关填充的内容,但不知道如何使用它。
这是我的模型
const mongoose = require('mongoose');
const fileSchema = mongoose.Schema({
_id: mongoose.SchemaTypes.ObjectId,
client_id: mongoose.SchemaTypes.ObjectId,
user_id: mongoose.SchemaTypes.ObjectId,
status: String,
name: String,
path: String,
clients: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Client' }]
});
const clientSchema = mongoose.Schema({
_id: mongoose.SchemaTypes.ObjectId,
name: String,
img: String
});
module.exports =
mongoose.model('File', fileSchema, 'files'),
Client = mongoose.model('Client', clientSchema, 'clientes');
这就是我现在获取文件数据的方式
exports.getFiles = (req, res, next) => {
File.find({ field: res.locals.field })
.select('_id client_id user_id status name path')
.exec()
.then(file => {
res.status(200).json({
response: file
});
})
.catch(err => {
console.log(err);
res.status('500').json({
error: err
});
});
};
这个 returns 一个 json 响应,当我尝试使用填充时我得到一个空数组。
您快完成了,但是您的查找搜索有问题。至少对于您发布的文件模型,您没有名为 'field' 的字段,因此您不会得到任何结果。
假设您正在尝试根据文件名查找文件并且请求被发送到 url 'blah/files/:name' 并且看起来您正在使用 Express.js 所以这应该有效。
要使用填充,您通常会执行以下操作:
File.find({ name: req.params.name })
.populate('clients')
.exec()
.then(files => {
res.status(200).json({
response: files
});
})
.catch(err => {
console.log(err);
res.status('500').json({
error: err
});
});
您的 'select' 位中的内容没有必要,因为您是基于文件模型开始搜索,而您只是要求它 return 您拥有的所有字段无论如何在那个模型上。您在结果 'for free'.
中得到那些 returned
填充在 'clients' 字段中被标记出来,因为您在文件模型中指定它是引用客户端模型的对象 ID。猫鼬应该基本上自动处理它。但是,请注意,Client 模型中的所有字段都将填充到 File 的 clients 数组中。如果您只想 return 为您的客户提供一个或几个字段,那么您应该使用 select。
另请注意:查找方法将 return 一个数组,即使它只是一个文档的结果。如果您期望或只想要一个结果,请改用 findOne 方法。
更新
您的模型文件中的模块导出似乎也存在错误,这可能就是您遇到问题的原因。我的编码风格与你的不同,但为了确保没有混乱,我会这样做:
const File = mongoose.model('File', fileSchema);
const Client = mongoose.model('Client', clientSchema);
module.exports = { File, Client };
然后在你的路由器代码中,你导入它们:
const { File, Client } = require('<path-to-model-file>');
我在节点 js 中有以下模型,我想在一次调用中从文件模式和客户端模式获取数据,我正在阅读有关填充的内容,但不知道如何使用它。
这是我的模型
const mongoose = require('mongoose');
const fileSchema = mongoose.Schema({
_id: mongoose.SchemaTypes.ObjectId,
client_id: mongoose.SchemaTypes.ObjectId,
user_id: mongoose.SchemaTypes.ObjectId,
status: String,
name: String,
path: String,
clients: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Client' }]
});
const clientSchema = mongoose.Schema({
_id: mongoose.SchemaTypes.ObjectId,
name: String,
img: String
});
module.exports =
mongoose.model('File', fileSchema, 'files'),
Client = mongoose.model('Client', clientSchema, 'clientes');
这就是我现在获取文件数据的方式
exports.getFiles = (req, res, next) => {
File.find({ field: res.locals.field })
.select('_id client_id user_id status name path')
.exec()
.then(file => {
res.status(200).json({
response: file
});
})
.catch(err => {
console.log(err);
res.status('500').json({
error: err
});
});
};
这个 returns 一个 json 响应,当我尝试使用填充时我得到一个空数组。
您快完成了,但是您的查找搜索有问题。至少对于您发布的文件模型,您没有名为 'field' 的字段,因此您不会得到任何结果。
假设您正在尝试根据文件名查找文件并且请求被发送到 url 'blah/files/:name' 并且看起来您正在使用 Express.js 所以这应该有效。
要使用填充,您通常会执行以下操作:
File.find({ name: req.params.name })
.populate('clients')
.exec()
.then(files => {
res.status(200).json({
response: files
});
})
.catch(err => {
console.log(err);
res.status('500').json({
error: err
});
});
您的 'select' 位中的内容没有必要,因为您是基于文件模型开始搜索,而您只是要求它 return 您拥有的所有字段无论如何在那个模型上。您在结果 'for free'.
中得到那些 returned填充在 'clients' 字段中被标记出来,因为您在文件模型中指定它是引用客户端模型的对象 ID。猫鼬应该基本上自动处理它。但是,请注意,Client 模型中的所有字段都将填充到 File 的 clients 数组中。如果您只想 return 为您的客户提供一个或几个字段,那么您应该使用 select。
另请注意:查找方法将 return 一个数组,即使它只是一个文档的结果。如果您期望或只想要一个结果,请改用 findOne 方法。
更新
您的模型文件中的模块导出似乎也存在错误,这可能就是您遇到问题的原因。我的编码风格与你的不同,但为了确保没有混乱,我会这样做:
const File = mongoose.model('File', fileSchema);
const Client = mongoose.model('Client', clientSchema);
module.exports = { File, Client };
然后在你的路由器代码中,你导入它们:
const { File, Client } = require('<path-to-model-file>');