我刚从mongoose 开始.我有一个用mongoose创建的脚本,它用样本数据创建模式和数据库.

现在我编写实际的应用程序.我是否需要在每次应用程序运行时创建schema对象,或者它是否已经可用?

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

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

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

推荐答案

其中一个定义为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,否则将引发异常).

然而,所有这些都只在一个 node 会话中起作用,因此如果你正在运行另一个需要访问Schema的 node 应用程序,那么你需要调用注册码.因此,最好在单独的文件中定义所有模式,例如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();将初始化给定 node 会话的所有模式.

Mongodb相关问答推荐

Mongo Aggregate管道-另一个集合中的多个查找

如何在 mongodb 查找的外键中使用正则表达式

在 Mongo 聚合中,可以通过分组生成 3 个不同的计数

MongoDB乘以对象值?

MongoDB C# 驱动程序 2.0 InsertManyAsync 与 BulkWriteAsync

如何将 MongoDB 集合中的 _id 字段更改为 User_id?

实现 twitter 和 facebook 之类的主题标签

如何在 Mongoose 中定义一个通用的嵌套对象

MongoDB 是否重用已删除的空间?

mongodb,pymongo,aggregate聚合给出奇怪的输出

查询 Mongoid/rails 3 中的嵌入对象(Lower than、Min 运算符和排序)

如何防止MongoDB在查找文档时返回对象ID?

填充mongoose后查找

如何仅通过一次调用将一组对象保存到mongoose数据库?

MongoDB 中的多个 $inc 更新

在 MongoDB 中快速搜索数十亿个小文档的策略

MongoDB 和 Robomongo: Can't connect (authentication)

验证 MongoCredential 的异常和未分类的 Mongo Db 异常

MongoError:Can't extract geo keys from object

MongoDB Compass timeouts超时