2015-02-10 199 views
2

所以,我一直在使用猫鼬一段时间,并且发现了一些非常奇怪的东西。如果有人能够启发我,那将会很棒。mongoose .find()方法返回具有不需要属性的对象

事情是,当使用猫鼬的.find()方法,我得到的对象是充满属性我不知道它来自哪里(我猜他们是内置的属性,但无论),我只想通过属性I .select()进行迭代。得到它了?没有?确定...解释更好:

我有我的架构和模型中声明:

var mySchema = mongoose.Schema({ 
    name: String, 
    prop1: String, 
    prop2: String, 
    prop3: String 
}) 
var myModel = DB.model('myDataBase', mySchema) 

然后我想找到名称的文件,比方说,约翰和检索所有,但“姓名”字段,所以我去:

myModel.find({name: 'John'}, '-name', function(err, results){ 
    log(results[0]) 
} 

和log(结果[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等。不仅这些extras属性,我还得到'name'属性,一个我排除了选择(它被排除在外,如第一个日志中所示)。怪怪的?

但是等等!还有更多!我在网上搜索,发现一些人说:“伙计,当通过对象属性迭代使用hasOwnProperty方法!”。所以我去了:

for (var key in results[0]){ 
    if (results[0].hasOwnProperty(key)) log(key) 
} 

日志结果是一些属性(具体:$ __,是否新款,错误,_maxListeners,_doc,_pres,_posts,保存_events)和犯规包括任何的道具我首先想要的。

我的问题是,我如何迭代只有道具1,2和3,排除这些,我不知道,内置属性和我明确排除参数中的一个? (PS:我想的解决方案不涉及必须将我的对象转换为数组,如果可能的话)

另外,不是一个问题本身,而是好奇心,这些属性从哪里来?为什么它们出现在for循环中而不是当我登录对象时?为什么我排除的属性('-name')也出现在for循环中?如果它不识别刚才记录的属性,那么它具有哪些属性?

感谢您的时间和帮助! 再见!

+1

.toObject()会给你一个普通的对象,也许这会有所帮助?额外的属性是因为你正在处理的是模型的一个实例,它不是一个普通的对象。 – 2015-02-10 22:19:08

+0

谢谢@Kevin B!仍然有很多问题,但这确实解决了我的问题!发表您的评论作为答案,所以我可以标记它的权利? BR! – 2015-02-10 22:29:14

回答

12

或者凯文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.

7

在这种情况下.toObject足以让您的循环以您期望的方式工作。

myModel.find({name: 'John'}, '-name', function(err, results){ 
    log(results[0].toObject()) 
} 

您最初获得额外的属性是由于这样的事实,results是附带不可用正常对象的附加属性和方法模型实例的集合。这些属性和方法是你的循环中出现的。通过使用toObject,您将得到一个没有所有这些附加属性和方法的普通对象。

+0

救了我一天。谢谢 – devprashant 2017-03-12 12:25:24

+0

我的下一个问题是 - 我怎么能欺骗这些'隐藏'的属性,用于测试? – 2017-12-21 12:10:48

相关问题