MST

星途 面试题库

面试题:MongoDB Shell中基于复杂逻辑的变量批量编辑

假设有一个集合bigData,文档中有一个字段'varField',其值是一个复杂的对象结构,对象中有多个层级的嵌套数组和对象。要求通过MongoDB Shell脚本,根据一系列复杂业务逻辑(例如:如果内层数组中的某个对象属性值满足特定数学公式,就修改外层对象的某个属性值)对集合中所有文档的'varField'进行批量编辑。请描述实现思路并给出关键代码片段。
37.6万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 遍历集合:使用find方法获取bigData集合中的所有文档。
  2. 解析复杂对象:对于每个文档的varField字段,递归地遍历其嵌套的数组和对象结构。
  3. 应用业务逻辑:在遍历过程中,检查内层数组中的对象属性值是否满足特定数学公式。
  4. 修改外层对象属性:如果满足条件,修改外层对象的指定属性值。
  5. 更新文档:使用update方法将修改后的文档写回到集合中。

关键代码片段

// 获取集合
var bigDataCollection = db.getCollection('bigData');

// 遍历集合中的所有文档
bigDataCollection.find().forEach(function(doc) {
    // 递归函数,用于遍历复杂对象结构
    function traverseObject(obj) {
        for (var key in obj) {
            if (Array.isArray(obj[key])) {
                for (var i = 0; i < obj[key].length; i++) {
                    traverseObject(obj[key][i]);
                }
            } else if (typeof obj[key] === 'object') {
                traverseObject(obj[key]);
            } else {
                // 这里应用业务逻辑,例如:
                if (key === 'targetProperty' && obj[key] === 42) { 
                    // 假设满足条件时,修改外层对象的 'outerProperty'
                    doc.varField.outerProperty = 'newValue';
                }
            }
        }
    }

    // 开始遍历文档的 varField
    traverseObject(doc.varField);

    // 更新文档
    bigDataCollection.update(
        {_id: doc._id},
        doc
    );
});