我的问题是,如何只遍历 prop 1、2 和 3,排除这些(我不知道)内置属性和我在参数中明确排除的属性?(ps:如果可能的话,我正在考虑一个不需要将我的对象转换为数组的解决方案)另外,这本身不是一个问题,但出于好奇,这些属性从何而来?为什么它们出现在 for 循环中而不是在我记录对象时出现?为什么我排除的属性 ('-name') 也出现在 for 循环中?如果 hasOwnProperty 无法识别刚刚记录的属性,它到底是干什么的?感谢您的时间和帮助!再见! 解决方案 替代 Kevin B 的答案,您可以通过 {lean: true} 作为选项:myModel.find({name: 'John'}, '-name', {lean: true}, function(err, results){日志(结果[0])}在 MongoDB 中,文档被简单地保存为对象.当 Mongoose 检索它们时,它会将它们转换为 Mongoose 文档.这样做时,它会添加所有包含在 for 循环中的键.这就是允许您使用所有文档方法的原因.如果您不会使用其中任何一个,lean 是一个不错的选择,因为它跳过了整个过程,提高了查询速度.可能快 3 倍.so, I've been working with mongoose for some time and I found some really weird stuff going on. It would be great if someone could enlighten me.The thing is, when using the .find() method of mongoose, the object I get as response is full of properties I don't know where It came from (I'm guessing they are built-in properties, but whatever) and I want to iterate only through the properties I .select(). Got it? No? ok... explaining better:I have my schema and model declared:var mySchema = mongoose.Schema({ name: String, prop1: String, prop2: String, prop3: String})var myModel = DB.model('myDataBase', mySchema)Then I want to find a document with the name, let's say, John and retrieve all but the 'name' field, so I go:myModel.find({name: 'John'}, '-name', function(err, results){ log(results[0])}and log(results[0]) logs{ prop1: 'one', prop2: 'two', prop3: 'three' }So far, so good. But the problems is, now I want to iterate through these properties and check one by one, and I don't know for sure how many 'props' each result will have, so I wanted to do something like:for(var key in results[0]){ log(key)}So, I'm hoping it will log 'prop1', 'prop2' and 'prop3', but no! Ok, I get props 1, 2 and 3, but also I get a lots of other properties and functions like: isNew, error, _maxListeners, _doc, etc. Not only these extras properties, I also get the 'name' property, the one I excluded from the selection (and it was excluded, like shown in the first log). Weird huh?But wait! There's more! I've searched online and found some people saying "Dude, when iterating through object properties use the hasOwnProperty method!". So there I went:for (var key in results[0]){ if (results[0].hasOwnProperty(key)) log(key)}the log result is a few properties (to be specific: $__, isNew, error, _maxListeners, _doc, _pres, _posts, save, _events) and doesnt include any of the props I wanted in the first place.My question is, how can I iterate through only prop 1, 2 and 3, excluding these, I don't know, built-in properties and the one I explicitly excluded in the parameters? (ps: I was thinking of a solution that doesnt involve having to convert my object into an array, if thats possible)Also, not a question per se, but for curiosity, where does these properties come from? Why do they appear in the for loop and not when I log the object? Why the property I excluded ('-name') also appears in the for loop? What the hell is hasOwnProperty for if it doesnt recognize the properties that were just logged?Thanks for your time and help!Bye! 解决方案 Alternatively to Kevin B's answer, you can pass {lean: true} as an option:myModel.find({name: 'John'}, '-name', {lean: true}, function(err, results){ log(results[0])}In MongoDB, the documents are saved simply as objects. When Mongoose retrieves them, it casts them into Mongoose documents. In doing so it adds all those keys that are being included in your for loop. This is what allows you to use all the document methods. If you won't be using any of these, lean is a great option as it skips that entire process, increasing query speed. Potentially 3x as fast. 这篇关于mongoose .find() 方法返回具有不需要的属性的对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 上岸,阿里云!
08-05 10:22