Mongodb - 删除空字段"递归"?

时间:2018-03-29 08:17:19

标签: mongodb

这是一个基于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
        }
    ]
}

感谢。

2 个答案:

答案 0 :(得分: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);
})

答案 1 :(得分:0)

上面没有为我工作。但是寻求更多的灵感。

这有效(使用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);
})