node.js - Mongoose 是否可以自动从 Mongodb 中提取模式?

标签 node.js mongodb mongoose

我还在学习Mongodb、Nodejs和Mongoose,所以如果这个问题缺乏理解,请原谅我的无知。

我发现必须在 Mongoose 中剖析每个 Mongodb 集合有点多余。具体来说,每个 Mongodb 集合的所有字段及其类型都需要在 Mongoose 的模式中说明。

因此,如果我有一个包含共享相同字段的文档的集合,例如:

> db.people.find()
    { "_id" : ObjectId("1111"), "name" : "Alice", "age": 30 }
    { "_id" : ObjectId("2222"), "name" : "Bob", "age": 25 }
    { "_id" : ObjectId("3333"), "name" : "Charlie", "age": 40 }

Mongoose+Nodejs连接这个Mongodb的方式

var mongoose = require('mongoose');
var personSchema = new mongoose.Schema({
    name     : String,
    age      : Number
});
mongoose.model("Person", personSchema, 'people');

最后一行包含集合名称作为第三个参数 ( explained here )。

是否有可能让 Mongoose 以某种方式自动从 Mongodb 集合中提取包含相同字段文档的集合的模式(即它们将具有相同的模式)?这样我们就不会必须在 Mongoose 中定义架构。

最佳答案

Mongoose 目前没有办法根据示例文档自动构建模式和模型。

虽然可以编写一个简单的文档到架构工具,并且它可以相当好地处理某些情况,但取决于数据库中集合和文档的性质,它不能准确反射(reflect)数据模型的各个方面。

例如,如果您有两个相关的集合:

var personSchema = Schema({
  _id     : Number,
  name    : String,
  age     : Number,
  stories : [{ type: Schema.Types.ObjectId, ref: 'Story' }]
}); 

var storySchema = Schema({
  title    : String
  author   : String
});

如您所见,stories 字段是与 story 集合关联的 ObjectId 数组。当存储在 MongoDB 集合中时,它将类似于:

{
    "_id" : ObjectId("52a1d3601d02442354276cfd"),
    "name" : "Carl",
    "age" : 27,
    "stories" : [
            ObjectId("52a1d33b1d02442354276cfc")
    ]
}

和故事:

{
    "_id" : ObjectId("52a1d33b1d02442354276cfc"),
    "title" : "Alice in Wonderland",
    "author" : "Lewis Carroll"
}

如您所见,stories 数组仅包含一个ObjectId,而没有存储它映射到的内容(stories 集合中的文档) .如果没有在模式中建立此连接,Mongoose 的一项功能是 populate ( reference )。

也许更重要的是,使用 Mongoose 的部分好处是拥有一个已声明的模式。虽然它可能是“NoSQL”并且 MongoDB 允许文档无模式,但许多驱动程序实际上鼓励开发人员拥有模式,因为它有助于在集合中强制执行一致的文档结构。如果您正在进行“生产”开发,那么对我来说,声明模式而不是推断模式似乎是明智的。虽然您可以使用设计文档,但在源代码中定义严格的 Schema 不仅可以实现设计,还有助于防止 Schema 被无意更改。

在 Mongoose 中声明模式非常容易,每个应用程序实例只需要完成一次。

您当然可以使用 underlying driver对于 NodeJS 上的 MongoDB,它根本没有模式支持。

关于node.js - Mongoose 是否可以自动从 Mongodb 中提取模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20416581/

上一篇:Mongodb 数组操作

下一篇:MongoDB 复杂索引

相关文章:

node.js - Express API REST 过滤数据 MongoDB

javascript - 所有 Schema 的 Schema 方法 - Mongoose 方法继承

javascript - 使用 Sequelize 每天每小时的负载数据

javascript - 正则表达式 : Do not split if previous character is in capitals?

node.js - express 中的 req.cookies 未被填充

java - Mongodb 非法访问异常

node.js - Babel 不尊重忽略 API 选项

django - sshtunnel.BaseSSHTunnelForwarder 无法与 SSH 网关建立 session

当我使用 db.<collection_name>.count() 时,MongoDB 报告为零

javascript - 返回插入的子文档