mongoose模式创build

我刚刚开始用mongoose。 我有一个创build脚本与mongoose创build模式和数据库与示例数据。

现在我写实际的应用程序。 我是否需要在每次运行应用程序时创build模式对象,还是以某种方式已经可用?

换句话说,我是否需要在每个使用mongoose访问数据库的应用程序中运行此代码,或者只是第一次运行该代码:

var Comments = new Schema({ title : String , body : String , date : Date }); 

如果我有setter / validations / etc,答案会如何变化?

一个定义了Schema这样应用程序就能理解如何将数据从MongoDB映射到JavaScript对象。 Schema是应用程序的一部分。 它与数据库无关 。 它只将数据库映射到JavaScript对象。 所以是的 – 如果你想有很好的映射,你需要在每个需要它的应用程序中运行这个代码。 它也适用于getters / setters / 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 ,否则会抛出exception)。

但是,所有这些只在一个节点会话内工作,所以如果您正在运行另一个需要访问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); }; 

然后创build可能看起来像这样的文件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(); 将初始化给定节点会话的所有模式。

您每次运行应用程序时都需要运行此初始化代码,以将mongoose注册到应用程序的模式。

当您的应用程序结束时,mongoose不会存储您的架构。 因此,下次运行使用Schema的应用程序时,您需要再次注册您的Schema。

但是,设置您的应用程序是相当容易的。

下面是代码的两个链接,演示了如何在mongoose中初始化模式。 第一个是JavaScript,第二个是CoffeeScript。

https://github.com/fbeshears/register_models

https://github.com/fbeshears/register_coffee_models

JavaScript演示只是一个应用程序。

CoffeeScript代码有两个独立的应用程序。 第一个使用MongoDB存储文档,第二个查找并显示第一个应用程序存储的文档。