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

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

我发现每个Mongodb集合都需要在Mongoose中parsing才有点多余。 具体而言,每个Mongodb集合的所有字段及其types需要在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目前还没有一种方法可以自动构buildSchema和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集合中的一个文档)。 没有在模式中build立此连接而丢失的Mongoose的一个function是populate ( 引用 )。

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

在Mongoose中声明Schema是相当容易的,每个应用程序实例只需要执行一次。

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