Javascript Can';无法访问对象的一个属性,该属性未定义

Javascript Can';无法访问对象的一个属性,该属性未定义,javascript,node.js,Javascript,Node.js,我正在使用全文搜索MongoDB。当我登录时,我可以看到我的成绩。但是,我无法在代码中访问此属性 function bestMatch(name){ ChebiEntry.find({$text: {$search: name}}, {score: {$meta: 'textScore'}},(e,results)=>{ if (results.length > 0){ results.forEach((obj)=>{ consol

我正在使用全文搜索MongoDB。当我登录时,我可以看到我的成绩。但是,我无法在代码中访问此属性

function bestMatch(name){

  ChebiEntry.find({$text: {$search: name}},
  {score: {$meta: 'textScore'}},(e,results)=>{
    if (results.length > 0){
      results.forEach((obj)=>{
        console.log(JSON.stringify(obj)); // This works, I see .score
        console.log(obj.score); // .score is allegedly undefined here...
      })

    } else {
      {
        return false;
      }
    }
  })
  .sort({score: {$meta: 'textScore'}})
}
这是我的输出。正如你所看到的,我的字符串化对象包含了我所需要的一切。但当我试着去读。分数时,它是未定义的。所有其他属性都可以正常工作

{"_id":"596d55fd2c446456a0ceb4be","id":3473,"name":"Cation","__v":0,"score":1.1}
undefined
{"_id":"596d560b2c446456a0cf10fc","id":23058,"name":"cation","__v":0,"score":1.1}
undefined
{"_id":"596d561e2c446456a0cfb067","id":36916,"name":"cation","__v":0,"score":1.1}
undefined
{"_id":"596d56032c446456a0ced48d","id":23058,"name":"cations","__v":0,"score":1}
undefined
{"_id":"596d561e2c446456a0cfb066","id":36916,"name":"cationes","__v":0,"score":1}
undefined
{"_id":"596d55fb2c446456a0cea1d6","id":4665,"name":"Divalent cation","__v":0,"score":0.75}
undefined
{"_id":"596d55ff2c446456a0ceccb1","id":9175,"name":"sodium(I) cation","__v":0,"score":0.75}
undefined
原因是
JSON.stringify()。为了解决您的问题,您可以执行以下操作:

results
  .map(obj => obj.toJSON())
  .forEach(obj => {
    console.log(obj.score);
  })
,除了在这种情况下,用户尝试在
中使用
for…迭代未处理对象的可枚举属性,并在枚举其键之前调用对象上的
.toJSON()
,解决了问题

或者,您可以将选项
{lean:true}
传递给您的查询,如下所示:

ChebiEntry.find(
  {$text: {$search: name}},
  {score: {$meta: 'textScore'}},
  {lean: true},
  (e, results) => {
    ...
  })
  ...
保持其余代码不变,这意味着您不必在对象上显式调用
toJSON()

原因是,如果对象上存在方法,则使用
JSON.stringify()
预处理对象。为了解决您的问题,您可以执行以下操作:

results
  .map(obj => obj.toJSON())
  .forEach(obj => {
    console.log(obj.score);
  })
,除了在这种情况下,用户尝试在
中使用
for…迭代未处理对象的可枚举属性,并在枚举其键之前调用对象上的
.toJSON()
,解决了问题

或者,您可以将选项
{lean:true}
传递给您的查询,如下所示:

ChebiEntry.find(
  {$text: {$search: name}},
  {score: {$meta: 'textScore'}},
  {lean: true},
  (e, results) => {
    ...
  })
  ...


保持代码的其余部分不变,这意味着您不必显式调用对象上的
toJSON()

您知道在将object.prop转换为字符串后无法读取它。@Darkrum您知道JSON.stringify没有转换到位,对吗?@Darkrum真的吗?不过,我没有修改“obj”。不管怎样,我注释掉了我的stringify行,但它仍然不起作用。我也尝试过:console.log(JSON.stringify(obj));控制台日志(对象名称);之后我似乎仍然可以阅读obj.propertystringification@Raven如果你想
console.dir(obj)
?@Darkrum它在
results
,或“they”中,但你似乎已经发现了。你知道你不能在将object.prop转换为字符串后读取它。@Darkrum你知道JSON.stringify没有转换到位,是吗?@Darkrum真的吗?不过,我没有修改“obj”。不管怎样,我注释掉了我的stringify行,但它仍然不起作用。我也尝试过:console.log(JSON.stringify(obj));控制台日志(对象名称);之后我似乎仍然可以阅读obj.propertystringification@Raven如果您想
console.dir(obj)
,该怎么办?@Darkrum它在
结果或“他们”中,但您似乎已经发现了。@PatrickRoberts谢谢,这很有效。我迭代这个对象的目的是创建一个得分大于1的对象数组,然后将其传递到其他地方。你能谈谈解决这个问题的最佳方法吗?不过,既然你回答了我贴出的问题,我就接受了——谢谢@Raven我的理解是,根据我引用的答案,
{lean:true}
的性能提升高达3倍,但我无法证实这一点,我只是重复了回答者的说法。这就是Mongo返回特殊对象或光标的原因,不是一个包含数据的常规对象吗?@Patrick Roberts,谢谢,这也有效,不需要修改我的代码。我从来都不知道Javascript会得到这个confusing@adeneo是的,它包含几个实现光标功能的属性,如中所示。您可以看到用户在对象上能够访问但不想访问的所有方法。@PatrickRoberts谢谢,这很有效。我迭代这个对象的目的是创建一个得分大于1的对象数组,然后将其传递到其他地方。你能谈谈解决这个问题的最佳方法吗?不过,既然你回答了我贴出的问题,我就接受了——谢谢@Raven我的理解是,根据我引用的答案,
{lean:true}
的性能提升高达3倍,但我无法证实这一点,我只是重复了回答者的说法。这就是Mongo返回特殊对象或光标的原因,不是一个包含数据的常规对象吗?@Patrick Roberts,谢谢,这也有效,不需要修改我的代码。我从来都不知道Javascript会得到这个confusing@adeneo是的,它包含几个实现光标功能的属性,如中所示。您可以看到用户能够访问对象但不想访问的所有方法。