如何使用 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>');