mongoose .find() 方法返回具有不需要的属性的对象

2024-03-14

所以,我和猫鼬一起工作已经有一段时间了,我发现了一些非常奇怪的事情。如果有人能启发我,那就太好了。

问题是,当使用 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(结果[0]) 日志

{ prop1: 'one',
  prop2: 'two',
  prop3: 'three' }

到目前为止,一切都很好。但问题是,现在我想迭代这些属性并一一检查,并且我不确定每个结果将有多少个“道具”,所以我想做类似的事情:

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 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是一个很好的选择,因为它跳过整个过程,提高了查询速度。速度可能快 3 倍。 https://groups.google.com/forum/#!topic/mongoose-orm/u2_DzDydcnA/discussion

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mongoose .find() 方法返回具有不需要的属性的对象 的相关文章

随机推荐