遍历 MongoDB 对象属性

Posted

技术标签:

【中文标题】遍历 MongoDB 对象属性【英文标题】:Iterating through a MongoDB Object Attribute 【发布时间】:2021-08-28 03:00:02 【问题描述】:

我有一个 Nestjs Rest API,我正在尝试从 MongoDB 查询一个对象。这是我在services.ts 文件中使用的代码。

    async findScore(id: string) 
    // Error Handling - Irrelevant to question
    if (!isValidObjectId(id)) return errorRes(HttpStatus.BAD_REQUEST, Messages.NOT_AN_ID)
    
    // Mongoose query to fetch object
    const existingAssessments = await this.assessmentModel.findById(id).lean()

    // Error Handling - Irrelevant to question
    if (!existingAssessments) return errorRes(HttpStatus.BAD_REQUEST, Messages.notFound("ASSESSMENT"))

    // Printing the queried object - THIS WORKS FINE - Prints the entire object
    console.log(existingAssessments)

    // Printing the answers array (array of array of booleans) of the queried object - THIS WORKS FINE - Prints [[true, false]]
    console.log(existingAssessments.answers)


    for (let answerArr in existingAssessments.answers) 
        // Printing the answers in each array of the queried object - THIS PRINTS OUT 0
        console.log(answerArr)
    

控制台日志语句的输出如下所示。

我刚刚查询的对象有一个名为answers 的属性,它是一个包含布尔值的数组。

在第一个 console.log 语句中,我打印了整个对象。 - 工作正常

在第二个 console.log 中,我单独打印 answers 属性。 - 工作正常

当我遍历 answers 数组以打印它们的值时,它总是打印 0。这实际上应该打印包含布尔值的子数组。

这就是我的 Mongo Schema 是如何为此属性定义的

answers: 
    type: [
        [
            type: Boolean
        ]
    ],
    required: false

这就是我的 DTO 查找此属性的方式。

@IsNotEmpty()
@IsArray()
answers: Boolean[][]  

请帮我打印 MongoDB 中查询对象的布尔数组数组中的值。

【问题讨论】:

【参考方案1】:

您需要使用for ... of 而不是for ... in

 // Printing the answers array (array of array of booleans) of the queried object - THIS 
 
existingAssessments =  answers: [[true, false]] 
console.log(existingAssessments.answers)


for (let answerArr of existingAssessments.answers) 
    console.log(answerArr)

for in 循环遍历对象的可枚举属性名称。

for of(ES6 中的新功能)确实使用 object-specific iterator 并循环由它生成的值。

【讨论】:

不敢相信我错过了。非常感谢!【参考方案2】:
let arr = ['el1', 'el2', 'el3'];

arr.addedProp = 'arrProp';

// elKey are the property keys which in your case is "0"
for (let elKey in arr) 
  console.log(elKey);


// elValue are the property values which in your case is array of 
for (let elValue of arr) 
  console.log(elValue)

【讨论】:

以上是关于遍历 MongoDB 对象属性的主要内容,如果未能解决你的问题,请参考以下文章

如何遍历对象数组以便在 Mongodb 嵌套数组中推送数据

mongodb用mongoose查库的对象,不能增加属性

MongoDB 更新对象并删除属性?

MongoDB 更新对象并删除属性?

mongodb `$lookup` 或 `join` 与对象数组内的属性

MongoDB查询列表中的对象属性