【问题标题】:Is it possible for Mongoose to automatically extract schemas from Mongodb?Mongoose 是否可以自动从 Mongodb 中提取模式?
【发布时间】:2013-12-23 08:56:11
【问题描述】:

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

我发现每个 Mongodb 集合都必须在 Mongoose 中进行剖析有点多余。具体来说,每个 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 中定义模式。

【问题讨论】:

  • 我认为不可能从 mongodb 检索架构,因为集合中的每个文档都可以有不同的架构
  • 感谢您指出这一点,我要强调的是,我只是在询问集合包含共享相同字段的文档的情况。
  • 如果不想使用架构,为什么还要使用 Mongoose?
  • @Alice 您可以手动将任何文档插入到集合中。 Mongo 是无模式的。因此,您无法可靠地实现这一目标。当然,您可以获取第一个文档并在此基础上进行分析,但是 Mongoose 不支持。
  • 如果不喜欢使用schema定义,直接使用mongodb nodejs native即可。它没有架构。

标签: node.js mongodb mongoose


【解决方案1】:

Mongoose 目前没有在给定示例文档的情况下自动构建模式和模型的方法。

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

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

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 集合相关联的ObjectIds 数组。当存储在 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 中声明 Schema 非常简单,每个应用程序实例只需声明一次。

您当然可以在根本不支持模式的 NodeJS 上为 MongoDB 使用 underlying driver

【讨论】:

  • 只是为了澄清ref 字段:“ref 选项告诉 Mongoose 在填充过程中使用哪个模型,在我们的例子中是 Story 模型。” ~population reference。感谢您提供信息丰富的答案!我希望我能投两次票!
猜你喜欢
  • 2012-12-23
  • 2016-03-18
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多