当前位置: 首页 > 面试题库 >

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

阎安邦
2023-03-14
问题内容

因此,我使用猫鼬已经有一段时间了,我发现确实发生了一些很奇怪的事情。如果有人能启发我,那就太好了。

问题是,当使用猫鼬的.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:我在想一种解决方案,如果可能的话,不涉及将我的html" target="_blank">对象转换成数组)

同样,这本身不是问题,而是出于好奇,这些属性从何而来?为什么它们出现在for循环中而不是在我记录对象时出现?为什么我排除的属性(“
-name”)也出现在for循环中?如果hasOwnProperty无法识别刚刚记录的属性,那到底是什么呢?

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


问题答案:

{lean: true}除了Kevin B的答案,您还可以选择:

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

在MongoDB中,文档仅保存为对象。当Mongoose检索它们时,它将它们转换为Mongoose文档。这样做会添加for循环中包含的所有那些键。这就是使您可以使用所有文档方法的原因。如果您不会使用其中任何一个,lean则是一个不错的选择,因为它会跳过整个过程,从而提高查询速度。可能快三倍。



 类似资料:
  • 问题内容: 从https://stackoverflow.com/a/1529099/156458 为了支持任意属性分配,对象需要一个:与对象关联的字典,可以在其中存储任意属性。否则,就无处放置新属性。 在可怕的循环依赖问题之前(因为它像大多数其他事物一样,都是从;-继承的),它的实例不会携带-如果这样做的话,这会使python中的每个对象都受字典约束,这意味着开销当前没有或不需要字典的每个对象中

  • 我在Hibernate中遇到了一个奇怪的问题。有两个数据库表存储活动票据和已解析票据。在Java中有一个超类(Ticket)和实体子类(ActiveTicket和ResolvedTicket)。 现在,当解析票据时,它将被移动到ResolvedTicket表。 现在我有了一个定制的findByID方法,我尝试首先检索活动票据,然后如果我有一个null对象,那么我尝试检索已解析票据。看起来是这样的:

  • 我有一个项目,其中我创建了一个BankAccount超级类和一个SavingsAccount子类。一切都很好,但我在返回我特别想要的字符串时遇到了麻烦。 示例:(裁剪) 驱动程序类将对BankAccount使用toString方法,并打印以下内容: (这对于这个超类来说是完美的) 但是,下面是SavingsAccount子类 调用SavingsAccount的toString方法时,它会打印: S

  • 我不能将完整的对象序列化到Java API Rest中。响应方法中没有返回某些属性。 我有一个这样的对象: 这是我在RestController中的方法的一个示例: 这是我的回报,没有这个人的财产: 我无法得到完整的物体

  • 本文向大家介绍JS返回iframe中frameBorder属性值的方法,包括了JS返回iframe中frameBorder属性值的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JS返回iframe中frameBorder属性值的方法。分享给大家供大家参考。具体分析如下: frameborder 属性规定是否显示框架周围的边框。 希望本文所述对大家的javascript程序设计有所帮助

  • 错误: 有表格:团队、组织。有一对多的关系。 团队模式 组织 JSP 如何让spring让所有组织都使用JSP? 更新: 我使用controller将所有组织和新团队对象的列表传递给jsp: 更新2: 是否限制使用多个模型属性,在这种情况下有两个:和?如何让它工作? 自定义属性名称:commandName描述:表单对象在其下公开的模型属性的名称。默认为“command”。必需:false可以具有运