44

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

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

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

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

如果我有设置器/验证器/等,答案将如何变化?

4

2 回答 2

76

一个定义Schema以便应用程序了解如何将数据从 MongoDB 映射到 JavaScript 对象。Schema是应用程序的一部分。它与数据库无关。它仅将数据库映射到 JavaScript 对象。所以是的——如果你想有一个很好的映射,你需要在每个需要它的应用程序中运行这个代码。它也适用于 getter/setter/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,那么您需要调用注册码。因此,在单独的文件中定义所有 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();将为给定节点会话初始化所有模式。

于 2012-04-10T04:35:51.920 回答
4

每次运行应用程序时都需要运行此初始化代码,以便向 mongoose 注册应用程序的 Schema。

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

但是,设置您的应用程序来执行此操作相当容易。

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

https://github.com/fbeshears/register_models

https://github.com/fbeshears/register_coffee_models

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

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

于 2013-03-18T00:26:15.897 回答