我还在学习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/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的