我刚刚开始使用猫鼬。我有一个带有mongoose的创建脚本,它使用示例数据创建模式和数据库。
现在我写了实际的应用程序。每次我的应用程序运行时是否需要创建模式对象,或者它是否已经以某种方式可用?
换句话说,我是否需要在每个使用mongoose访问数据库的应用程序中运行此代码,或者只是第一次:
var Comments = new Schema({
title : String
, body : String
, date : Date
});
如果我有setter / validations / etc,答案会如何改变?
答案 0 :(得分:75)
一个定义Schema
,因此应用程序了解如何将MongoDB中的数据映射到JavaScript对象。 Schema
是应用程序的一部分。它与数据库有 nothing 。它只将数据库映射到JavaScript对象。所以是 - 如果你想拥有漂亮的映射,你需要在需要它的每个应用程序中运行此代码。它也适用于getter / setters / validations / etc.
请注意这样做:
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
的节点应用程序,那么您需要调用注册码。因此,在单独的文件中定义所有模式是个好主意,例如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();
将初始化给定节点会话的所有模式。
答案 1 :(得分:4)
每次运行应用程序时都需要运行此初始化代码,以便用猫鼬注册应用程序的模式。
当您的应用结束时,mongoose不会存储您的架构。因此,下次运行使用Schema的应用程序时,需要再次注册Schema。
但是,设置你的应用程序相当容易。
以下是两个代码链接,演示了如何在mongoose中初始化模式。第一个是在JavaScript中,第二个是在CoffeeScript中。
https://github.com/fbeshears/register_models
https://github.com/fbeshears/register_coffee_models
JavaScript演示只是一个应用程序。
CoffeeScript代码有两个独立的应用程序。第一个使用MongoDB存储文档,第二个查找并显示第一个应用程序存储的文档。