gpt4 book ai didi

mongodb - 删除所有为空的字段

转载 作者:行者123 更新时间:2023-12-02 04:30:17 24 4
gpt4 key购买 nike

如何从给定集合的所有文档中删除所有 null 字段?

<小时/>

我收集了一些文档,例如:

{
'property1': 'value1',
'property2': 'value2',
...
}

但每个文档可能有一个 null 条目而不是值条目。

我想要save disk space删除所有 null 条目。在我的例子中,null 条目的存在不包含任何信息,因为我先验知道 JSON 文档的格式。

最佳答案

启动Mongo 4.2db.collection.update()可以接受聚合管道,最终允许根据其值删除字段:

// { _id: ObjectId("5d0e8...d2"), property1: "value1", property2: "value2" }
// { _id: ObjectId("5d0e8...d3"), property1: "value1", property2: null, property3: "value3" }
db.collection.update(
{},
[{ $replaceWith: {
$arrayToObject: {
$filter: {
input: { $objectToArray: "$$ROOT" },
as: "item",
cond: { $ne: ["$$item.v", null] }
}
}
}}],
{ multi: true }
)
// { _id: ObjectId("5d0e8...d2"), property1: "value1", property2: "value2" }
// { _id: ObjectId("5d0e8...d3"), property1: "value1", property3: "value3" }

详细信息:

  • 第一部分 {} 是匹配查询,过滤要更新的文档(在我们的示例中为所有文档)。

  • 第二部分[{ $replaceWith: { ... }] 是更新聚合管道(注意方括号表示聚合管道的使用):

    • $objectToArray ,我们首先将文档转换为键/值数组,例如 [{ k: "property1", v: "value1"}, { k: "property2", v: null }, ...]
    • $filter ,我们通过删除 vnull 的项目来过滤此键/值数组。
    • 然后,我们使用 $arrayToObject 将过滤后的键/值数组转换回对象。 .
    • 最后,我们将整个文档替换为修改后的 $replaceWith .
  • 不要忘记{ multi: true },否则只会更新第一个匹配的文档。

关于mongodb - 删除所有为空的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25287204/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com