因此,我使用 mongoose 已经有一段时间了,我发现了一些非常奇怪的事情。如果有人能启发我,那就太好了。
问题是,当使用 Mongoose 的 .find() 方法时,我作为响应获得的对象充满了我不知道它来自哪里的属性(我猜它们是内置属性,但是随便),我只想遍历我.select() 的属性。知道了?不?好的...更好地解释:
我声明了我的架构和模型:
var mySchema = mongoose.Schema({
name: String,
prop1: String,
prop2: String,
prop3: String
})
var myModel = DB.model('myDataBase', mySchema)
然后我想找到一个名称为 John 的文档,然后检索除“名称”字段之外的所有内容,所以我开始:
myModel.find({name: 'John'}, '-name', function(err, results){
log(results[0])
}
和 log(results[0]) 日志
{ prop1: 'one',
prop2: 'two',
prop3: 'three' }
到目前为止,还不错。但问题是,现在我想遍历这些属性并一一检查,但我不确定每个结果会有多少“ Prop ”,所以我想做类似的事情:
for(var key in results[0]){
log(key)
}
所以,我希望它会记录“prop1”、“prop2”和“prop3”,但是没有!好的,我得到了 props 1、2 和 3,但我也得到了很多其他属性和函数,如:isNew、error、_maxListeners、_doc 等。不仅这些额外的属性,我还得到了“name”属性,我从选择中排除的一个(它被排除在外,如第一条日志所示)。很奇怪吧?
但是等等!还有更多!我在网上搜索过,发现有人说“伙计,在遍历对象属性时使用 hasOwnProperty 方法!”。所以我去了:
for (var key in results[0]){
if (results[0].hasOwnProperty(key)) log(key)
}
日志结果是一些属性(具体来说:$__、isNew、error、_maxListeners、_doc、_pres、_posts、save、_events)并且不包括我一开始想要的任何 Prop 。
我的问题是,我如何才能仅遍历 prop 1、2 和 3,排除这些我不知道的内置属性和我在参数中明确排除的属性? (ps:我正在考虑一个解决方案,如果可能的话,不必将我的对象转换为数组)
此外,这本身不是问题,而是出于好奇,这些属性从何而来?为什么它们出现在 for 循环中而不是在我记录对象时?为什么我排除的属性('-name')也出现在 for 循环中?如果 hasOwnProperty 不能识别刚刚记录的属性,它到底是干什么的?
感谢您的宝贵时间和帮助! 再见!
最佳答案
除了 Kevin B 的回答,您可以将 {lean: true} 作为选项传递:
myModel.find({name: 'John'}, '-name', {lean: true}, function(err, results){
log(results[0])
}
在 MongoDB 中,文档被简单地保存为对象。当 Mongoose 检索它们时,它会将它们转换为 Mongoose 文档。这样做时,它会添加所有包含在 for 循环中的键。这就是允许您使用所有文档方法的原因。如果您不会使用其中任何一个,lean 是一个不错的选择,因为它会跳过整个过程,从而提高查询速度。 Potentially 3x as fast.
关于javascript - mongoose .find() 方法返回具有不需要属性的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28442920/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类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
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah