【问题标题】:Mongodb - remove null fields "recursively"?Mongodb - “递归”删除空字段?
【发布时间】:2019-01-07 23:50:16
【问题描述】:

这是一个基于MongoDb - remove all fields that are null 的问题。引用的帖子仅提供了在顶层删除空字段的解决方案。但是,如何删除嵌入的空字段?

请注意,我不知道空字段的可能名称及其深度,所以我认为我们必须遍历每个文档的每个字段。

这是一个例子:

{
    "id": 14770467,
    "f1": "a",
    "f2": null,
    "f3": [
        {
            "id": 76946819,
            "f4": null
        }
    ]
}

我期待这样的事情:

{
    "id": 14770467,
    "f1": "a",
    "f3": [
        {
            "id": 76946819
        }
    ]
}

谢谢。

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    试试这个

    const remove = (data) => {
        for (let key in data) {
            const val = data[key];
            if (val == null) {
                delete data[key];
            } else if (Array.isArray(val)) {
                val.forEach((v) => {
                    remove(v);
                });
            }
        }
        return data;
    }
    
    
    db.getCollection('Collection').find({}).forEach((data) => {
        data = remove(data);
        db.getCollection('OtherCollection').insert(data);
        //db.getCollection('Collection').save(data); // update same record
        print(data);
    })
    

    【讨论】:

    • 哇!这就像一个魅力! @Rahul Sharma。但是你能解释一下吗? (对不起,我对MongoDB和JavaScript一无所知)“=>”符号来自JS吗?以及如何将查询结果存储在新集合中?非常感谢。
    • 是的,它是一个 javascript 符号。你如何检查结果?你在运行 node.js 吗?
    • @R.Zhu 我已经更新了答案检查。您可以在 MongoDB 中执行 javascript 操作。
    • @RahulSharma 我将您的代码保存为 javascript 文件并从 mongo shell 执行为 load('test.js')。创建了一个新集合,它为我提供了以前集合的精确副本。
    • @RahulSharma 我正在使用 mongo shell,您的代码完全符合我的预期!实际上我测试了db.newCollection.save(data)db.newCollection.insert(data),发现结果是一样的。那么saveinsert 都可以吗?
    【解决方案2】:

    以上对我不起作用。但这是寻求更多的灵感。

    这有效(使用 MongoDB shell 版本 v4.0.5):

    const remove= (obj) => {
       Object.keys(obj).forEach(key => {
         if (obj[key] && typeof obj[key] === 'object') removeEmpty(obj[key]);
         else if (obj[key] == null) delete obj[key];
       });
    };
    
    db.getCollection('Collection').find({}).forEach((data) => {
      remove(data);
      db.getCollection('OtherCollection').insert(data);
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-21
      • 1970-01-01
      • 2016-06-19
      • 2012-07-29
      • 1970-01-01
      • 1970-01-01
      • 2014-01-08
      • 1970-01-01
      相关资源
      最近更新 更多