Mongoose错误:嵌套架构

时间:2014-12-02 21:37:02

标签: node.js mongodb mongoose

我对嵌套Mongoose架构有疑问。

这是一个简单的代码段

var aSchema = new Schema({bar: String});
var bSchema = new Schema({a: aSchema, foo: String});
var cSchema = new Schema({as: [aSchema], foo:String});

这会将TypeError投放到bSchemaTypeError: Undefined type at 's' Did you try nesting Schemas? You can only nest using refs or arrays.,但适用于cSchema

只想问为什么bSchema不起作用。在Mongoose doc中找不到解释。感谢。

2 个答案:

答案 0 :(得分:8)

MongoDB 关系数据库。这可能会让一些习惯RDBS模型的人感到困惑(我偶尔也会绊倒......但我真的不是数据库人员。)

通常,您会发现在Mongo实体中引用其他文档是有益的。 Mongoose模式提供了一种非常简单有效的方法来实现这种感觉非常关系。

定义将存储对不同类型文档的引用的架构时,将相关属性定义为具有typeref的对象。通常,在定义架构属性时,您可以简单地说:a: Number;但是,Mongoose为类型以外的架构属性提供了许多不同的选项:

a: {
   type: Number,
   required: true   
}

设置required: true会阻止我们保存不存在a属性的文档。

了解了如何使用对象定义定义模式后,您可以利用Mongoose的人口机制:

a: {
   type: Mongoose.Schema.ObjectId,
   ref: 'a'
}

这告诉Mongoose将特定ObjectId文档的a(特定于Mongoose的标识符)存储为我们架构的a属性。还在跟着我?

在Mongoose文档上设置此属性时,您只需说:doc.a = myA。当您去保存doc时,Mongoose将自动进行转换,并仅将ID存储在您的数据库中。

检索引用其他架构的文档时,您需要填充。我不会进入那个,但它非常简单 - check out the documentation

答案 1 :(得分:2)

我遇到了这个问题,因为我对 MongoDB 完全不熟悉。后来我发现我们需要在 Mongoose 的帮助下使用下面的关系。

以下是我的国家/地区架构。

var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var ObjectId = Schema.Types.ObjectId;

var CountrySchema = new Schema({
    name: { type: String, required: true },
    activeStatus: Boolean,
    createdOn: Date,
    updatedOn: Date
});

我可以在我的状态模式中使用此模式,如下所示。

var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var ObjectId = Schema.Types.ObjectId;

var StateSchema = new Schema({
    name: { type: String, required: true },
    country: {type: ObjectId, ref: "Country"},
    activeStatus: Boolean,
    createdOn: Date,
    updatedOn: Date
});

我在 ref 的帮助下使用指向我的其他架构。