mongoose 模式未在填充字段中注册错误

Posted

技术标签:

【中文标题】mongoose 模式未在填充字段中注册错误【英文标题】:mongoose schema not registered error in populating field 【发布时间】:2016-02-01 11:29:27 【问题描述】:

我有一个类似于 -

的 mongoose 数据库架构
'use strict';

var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

/**
 * Discussion Question Schema
 */
var QuerySchema = new Schema(
    date: 
        type: Date,
        default: Date
    ,
    user: 
        type: Schema.ObjectId,
        ref: 'User'
    ,
    class: 
        type: Schema.ObjectId,
        ref: 'Class'
    
);

module.exports = mongoose.model('Query',  QuerySchema);

现在我想填充用户架构和类架构的一些字段,而不是所有字段,那么我该如何在快速控制器中完成此操作

var query = Query.find().populate('user','name email avatar');
    query.paginate(options,function(err, resp)
        if(err)  return handleError(res, err); 
        console.log(resp);
        return res.status(200).json(resp.results);
    );

所以我只填充'user' 架构中的'name email avatar',但我还想填充“类”架构的一些字段,例如'name, strength' 我为此尝试了以下方法,但没有从服务器获得所需的响应 -

var query = Query.find().populate('user class','name email avatar');
var query = Query.find().populate('user','name email avatar class');

[更新]

class 添加到填充字段列表时出现以下错误

E:\work\01India\applications-tests\themeforest-8437259-angular-bootstrap-admin-web-app-with-angularjs\node_modules\mongoose\lib\connection.js:660
    throw new MongooseError.MissingSchemaError(name);
    ^
MissingSchemaError: Schema hasn't been registered for model "Class".
Use mongoose.model(name, schema)
    at NativeConnection.Connection.model (E:\work\01India\applications-tests\themeforest-8437259-angular-bootstrap-admin-web-app-with-angularjs\node_modules\mongoose\lib\connection.js:660:11)
    at getModelsMapForPopulate (E:\work\01India\applications-tests\themeforest-8437259-angular-bootstrap-admin-web-app-with-angularjs\node_modules\mongoose\lib\model.js:2366:26)
    at populate (E:\work\01India\applications-tests\themeforest-8437259-angular-bootstrap-admin-web-app-with-angularjs\node_modules\mongoose\lib\model.js:2207:15)
    at Function.Model.populate (E:\work\01India\applications-tests\themeforest-8437259-angular-bootstrap-admin-web-app-with-angularjs\node_modules\mongoose\lib\model.js:2177:5)
    at Immediate.cb (E:\work\01India\applications-tests\themeforest-8437259-angular-bootstrap-admin-web-app-with-angularjs\node_modules\mongoose\lib\query.js:1011:16)
    at Immediate._onImmediate (E:\work\01India\applications-tests\themeforest-8437259-angular-bootstrap-admin-web-app-with-angularjs\node_modules\mongoose\node_modules\mquery\lib\utils.js:137:16)
    at processImmediate [as _immediateCallback] (timers.js:374:17)

我的班级架构如下 -

'use strict';

var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

/**
 * Class Schema
 */
var ClassSchema = new Schema(
    date: 
        type: Date,
        default: Date
    ,
    class: 
        type: String,
        enum: ['10','12']
    ,
    subjects: [
        type: Schema.ObjectId,
        ref: 'Subject'
    ]
);

module.exports = mongoose.model('Class',  ClassSchema);

当我在 mongo shell 中键入以下查询时,我的类集合的内容是 -

db.classes.find();

这个输出是 -

 "_id" : ObjectId("5635f365e21a4b9015904e08"), "subjects" : [ "5635f365e21a4b9015904e08", "56360f5029a82c0823eac2b8" ], "date" : ISODate("2015-11-01T11:11:33Z"), "__v" : 0, "class" : "10" 

【问题讨论】:

【参考方案1】:

将两个populate 调用链接在一起,以便您可以分别设置每个字段的选项:

var query = Query.find().populate('user','name email avatar')
                          .populate('class','name strength');

【讨论】:

它工作正常,谢谢。我还更新了问题,因为我收到了未注册模式的错误我在我的 app.js 中从其他 SO 问题“require('./api/class/class.model');”中添加了这一行所以任何方法都可以确保所有模型在使用之前都正确初始化和注册 有很多方法可以做到这一点,但一种常见的方法是创建一个需要所有模型的新文件,然后像 app.js 这样的文件只需要一个文件。 我现在有一个更新用户模式,它有一个字段类。所以,现在我有类似 query.class 和 query.user.class 的东西,它们都有Class 的模式类型,我必须填充它们吗?我怎样才能做到这一点 ?你能帮我解决这个@JohnnyHK 你能看看吗-***.com/questions/33466155/…

以上是关于mongoose 模式未在填充字段中注册错误的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose .populate 未在 JSON 中显示

猫鼬自己填充自定义查询

从父模式填充字段

从父模式填充字段

Mongoose MongoDb 未在 Node Shell 中显示模式或模型

查询未在 Mongoose 模型中定义的文档