在 Node JS 中填充 Mongoose

Posted

技术标签:

【中文标题】在 Node JS 中填充 Mongoose【英文标题】:Mongoose Populate in Node JS 【发布时间】:2013-02-03 16:17:35 【问题描述】:

我一直在尝试关注Mongoose Population 中的信息,但我遇到了异常:

MissingSchemaError:尚未为模型“未定义”注册架构。

我的代码是这样的:

mongoose = require('mongoose');
Schema = mongoose.Schema;
mongoose.connect(MONGO_SERVER);
ObjectId = Schema.ObjectId;

var FirstSchema = new Schema(
    label       : String
);
var SecondSchema = new Schema(
    first_id           : [ type: mongoose.Schema.ObjectId, ref: 'First' ],
    type           : String,
    ...
);
var first= mongoose.model('First', FirstSchema);
var second= mongoose.model('Second', SecondSchema);

function test() 
    ...
    second.find().populate('first_id').exec(function(err,data)return true;);
    ...

错误发生在填充上,我已经根据论坛上的不同答案对其进行了多次调整,我相信这会很简单,但有人能指出我正确的方向吗?

干杯。

【问题讨论】:

【参考方案1】:

在您的架构定义中,我看到您已将“first_id”定义为第二架构中的数组。与关系数据库相比,这将类似于一对多的关系,其中父表是第二个集合,而第一个集合是子表。那么你在尝试用第一个填充第二个时做错了。

假设我有一个 Users 集合和一个 Clients 集合,其中每个客户端都有一个与之相关的用户。那么代码将是:

var mongoose = require('mongoose');
mongoose.connect('mongodb://userName:password@server:port/dbname');
var conn = mongoose.connection;
conn.on('error', console.error.bind(console, 'connection error:'));
conn.once('open', function callback () 
    console.log('connected ');
);

var user = mongoose.Schema(
    userName: String
);

var client = mongoose.Schema(
    fk_user:  type: mongoose.Schema.ObjectId, ref: 'Users' ,
    name: String
);

var UserModel = mongoose.model('Users', user);
var ClientModel = mongoose.model('Clients', client);

ClientModel.findOne().populate('fk_user').exec(function(err, c) 
    if (err)  return console.log(err); 

    console.log(c.fk_user.userName);
);

希望这能给你一些帮助。

【讨论】:

非常感谢,约翰!我一定是在那个部分复制了那个 ref 字段对象从某个地方到一个数组中,或者它是一个错字,无论如何 - 现在一切都修复了,干杯!【参考方案2】:

我有同样的错误

尚未为模型“States”注册架构。

有时也可能是您尝试引用的模型未分配给架构。

就像下面的代码一样

首先:我试图引用我使用 States 创建的“states”模型,但它不是模型的名称,而是名称是 states

var CountriesSchema = new Schema(

name: type:String,required:true,
capital:type:String,
description:type:String,
cord:

    latitude:type:Number,
    longitude:type:Number

,
state:[type:Schema.Types.ObjectId , ref:'States'],
date_created:type:Date,
date_modeified:type:Date



);

同时模型的真实名称是 states

 var State = mongoose.model('states',StateSchema) ;

module.exports = State ;

我所做的只是将状态更改为状态

var CountriesSchema = new Schema(

    name: type:String,required:true,
    capital:type:String,
    description:type:String,
    cord:

        latitude:type:Number,
        longitude:type:Number

    ,
    state:[type:Schema.Types.ObjectId , ref:'states'],
    date_created:type:Date,
    date_modeified:type:Date



);

【讨论】:

以上是关于在 Node JS 中填充 Mongoose的主要内容,如果未能解决你的问题,请参考以下文章

在 Node JS 中填充 Mongoose

无法在 node.js 中用猫鼬填充数组

从 Express/node.js Web 应用程序预填充 HTML/Jade

有没有办法在 node.js 中使用 Model.find() 查询和填充字段过滤器

使用 Node.js 的 MongoDB 引用我无法填充

使用 Node 和 Handlebars 动态填充下拉列表