猫鼬模式创建

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.jssecond.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 存储文档,第二个查找并显示第一个应用存储的文档。

【讨论】:

以上是关于猫鼬模式创建的主要内容,如果未能解决你的问题,请参考以下文章

使用猫鼬和打字稿创建模式

创建包含对象数组的猫鼬模式

如何使用对象数组创建猫鼬模式

如何创建猫鼬模式以仅接受一些谨慎的值

更新猫鼬模式后,新输入的字段未插入已创建的集合中

如何在猫鼬中为 geojson 数据创建模式?