mongoose架构创建

Yar*_*veh 43 mongoose mongodb node.js

我刚刚开始使用猫鼬.我有一个带有mongoose的创建脚本,它使用示例数据创建模式和数据库.

现在我写实际的应用程序.每次我的应用程序运行时是否需要创建模式对象,或者它是否已经以某种方式提供?

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

var Comments = new Schema({
    title     : String
  , body      : String
  , date      : Date
});
Run Code Online (Sandbox Code Playgroud)

如果我有setter/validations/etc,答案会怎样改变?

fre*_*ish 77

一个定义,Schema因此应用程序了解如何将MongoDB中的数据映射到JavaScript对象.Schema是申请的一部分.它与数据库无关.它只将数据库映射到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);
Run Code Online (Sandbox Code Playgroud)

将注册全球Schema.这意味着如果您正在运行的应用程序正在使用某些外部模块,那么您可以在此模块中使用

var mongoose = require('mongoose');
var Comments = mongoose.model("Comments");
Comments.find(function(err, comments) {
    // some code here
});
Run Code Online (Sandbox Code Playgroud)

(请注意,您实际上需要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);
};
Run Code Online (Sandbox Code Playgroud)

然后创建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])();
    }
};
Run Code Online (Sandbox Code Playgroud)

现在调用require('models.js').initialize();将初始化给定节点会话的所有Schema.