猫鼬模式创建
Posted
技术标签:
【中文标题】猫鼬模式创建【英文标题】:mongoose schema creation 【发布时间】:2012-04-22 07:43:44 【问题描述】:我刚开始使用猫鼬。我有一个带有 mongoose 的创建脚本,它使用示例数据创建模式和数据库。
现在我编写实际的应用程序。每次我的应用程序运行时我都需要创建架构对象,还是它已经以某种方式可用?
换句话说,我需要在每个使用 mongoose 访问数据库的应用程序中运行此代码还是第一次运行此代码:
var Comments = new Schema(
title : String
, body : String
, date : Date
);
如果我有 setter/validations/etc,答案会如何变化?
【问题讨论】:
【参考方案1】:定义Schema
以便应用程序了解如何将数据从 MongoDB 映射到 javascript 对象。 Schema
是应用程序的一部分。它与数据库无关。它仅将数据库映射到 JavaScript 对象。所以是的 - 如果你想拥有漂亮的映射,你需要在 每个 需要它的应用程序中运行此代码。它也适用于 getter/setter/validations/等。
但是请注意,这样做:
var mongoose = require('mongoose');
var Schema = mongoose.Schema; // <-- EDIT: missing in the original post
var Comments = new Schema(
title : String
, body : String
, date : Date
);
mongoose.model("Comments", Comments);
将在全球注册Schema
。这意味着如果您正在运行的应用程序正在使用一些外部模块,那么在这个模块中您可以简单地使用
var mongoose = require('mongoose');
var Comments = mongoose.model("Comments");
Comments.find(function(err, comments)
// some code here
);
(注意,在使用此代码之前,您实际上需要注册Schema
,否则会抛出异常)。
然而,所有这些都只在一个节点会话中有效,所以如果您正在运行另一个需要访问Schema
的节点应用程序,那么您需要调用注册码。所以在单独的文件中定义所有 Schema 是个好主意,例如 comments.js
可能看起来像这样
var mongoose = require('mongoose');
var Schema = mongoose.Schema; // <-- EDIT: missing in the original post
module.exports = function()
var Comments = new Schema(
title : String
, body : String
, date : Date
);
mongoose.model("Comments", Comments);
;
然后创建文件models.js
,它可能看起来像这样
var models = ['comments.js', 'someothermodel.js', ...];
exports.initialize = function()
var l = models.length;
for (var i = 0; i < l; i++)
require(models[i])();
;
现在调用 require('models.js').initialize();
将为给定节点会话初始化所有架构。
【讨论】:
是的,这很酷。使用这种方法,你对如何处理依赖(嵌入文档)有什么想法吗? @AdrienSchuler 依赖没有问题。您像往常一样在其中一个文件中定义嵌入文档。只要确保如果文件second.js
引用文件first.js
中的模型,那么first.js
在second.js
变量中位于second.js
之前。
所以mongoose.model("Comments", Comments);
这行只全局注册模型而不返回?那么如何重复使用呢?
@Slavo var Comments = mongoose.model( "Comments" );
.
MissingSchemaError: 尚未为模型“评论”注册架构。【参考方案2】:
您确实需要在每次运行应用时都运行此初始化代码,以便向 mongoose 注册应用的架构。
当您的应用程序结束时,mongoose 不会存储您的架构。因此,下次您运行使用 Schema 的应用时,您需要再次注册您的 Schema。
但是,设置您的应用来执行此操作相当容易。
这里有两个代码链接,演示了如何在 mongoose 中初始化模式。第一个是 JavaScript,第二个是 CoffeeScript。
https://github.com/fbeshears/register_models
https://github.com/fbeshears/register_coffee_models
JavaScript 演示只是一个应用程序。
CoffeeScript 代码有两个独立的应用程序。第一个使用 MongoDB 存储文档,第二个查找并显示第一个应用存储的文档。
【讨论】:
以上是关于猫鼬模式创建的主要内容,如果未能解决你的问题,请参考以下文章