Mongoose可以自动从Mongodb中提取模式吗?

我仍然在学习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');

最后一行包含集合名称作为第三个参数(在这里解释)。

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


给定一个示例文档,Mongoose目前没有自动构建Schema和Model的方法。

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

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

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 (引用)。

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

在Mongoose中声明一个Schema非常简单,只需要为每个应用程序实例执行一次。

您当然可以在NodeJS上使用MongoDB的底层驱动程序,它根本没有模式支持。

链接地址: http://www.djcxy.com/p/60687.html

上一篇: Is it possible for Mongoose to automatically extract schemas from Mongodb?

下一篇: How to use Document#update in Mongoose?