因此,我使用猫鼬已经有一段时间了,我发现确实发生了一些很奇怪的事情。如果有人能启发我,那就太好了。
问题是,当使用猫鼬的.find()方法时,作为响应获得的对象充满了我不知道它来自何处的属性(我猜它们是内置属性,但无论如何),我只想通过I.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]) }
和日志(结果[0])日志
{ prop1: 'one', prop2: 'two', prop3: 'three' }
到目前为止,一切都很好。但是问题是,现在我想遍历这些属性并逐个检查,而且我不确定每个结果将有多少个“道具”,所以我想做些类似的事情:
for(var key in results[0]){ log(key) }
因此,我希望它会记录“ prop1”,“ prop2”和“ prop3”,但不会!好的,我得到了道具1、2和3,但是我还得到了很多其他属性和函数,例如:isNew,error,_maxListeners,_doc等。不仅这些额外属性,我还获得了’name’属性,我从选择中排除了一个(并且排除了它,如第一个日志中所示)。奇怪吗?
可是等等!还有更多!我在网上搜索过,发现有些人说“ Dude,在遍历对象属性时使用hasOwnProperty方法!”。所以我去了:
for (var key in results[0]){ if (results[0].hasOwnProperty(key)) log(key) }
日志结果是一些属性(具体是:$ __,isNew,error,_maxListeners,_doc,_pres,_posts,save,_events),并且不包括我最初想要的任何道具。
我的问题是,我如何只遍历prop 1、2和3,不知道内置属性和参数中明确排除的那些属性,不知道这些属性?(ps:我在想一种解决方案,如果可能的话,不涉及将我的对象转换成数组)
同样,这本身不是问题,而是出于好奇,这些属性从何而来?为什么它们出现在for循环中而不是在我记录对象时出现?为什么我排除的属性(“ -name”)也出现在for循环中?如果hasOwnProperty无法识别刚刚记录的属性,那到底是什么呢?
感谢您的时间和帮助!再见!
{lean: true}除了Kevin B的答案,您还可以选择:
{lean: true}
myModel.find({name: 'John'}, '-name', {lean: true}, function(err, results){ log(results[0]) }
在MongoDB中,文档仅保存为对象。当Mongoose检索它们时,它将它们转换为Mongoose文档。这样做会添加for循环中包含的所有那些键。这就是使您可以使用所有文档方法的原因。如果您不会使用其中任何一个,lean则是一个不错的选择,因为它会跳过整个过程,从而提高查询速度。可能快三倍。
for
lean