gpt4 book ai didi

mongodb - 如何取消设置除一组已知字段之外的所有字段?

转载 作者:行者123 更新时间:2023-12-01 21:39:38 25 4
gpt4 key购买 nike

假设我的 mongo 集合中有一个文档,如下所示:

{
"_id": 123,
"field_to_prune":
{
"keep_field_1": "some value",
"random_field_1": "some value",
"keep_field_2": "some value",
"random_field_2": "some value",
"random_field_3": "some value"
}
}

我想将该文档修剪为如下所示:

{
"_id": 123,
"field_to_prune":
{
"keep_field_1": "some value",
"keep_field_2": "some value"
}
}

但是,我的问题是我不知道“随机”字段名称是什么。在 mongo 中,我如何取消设置除几个已知字段之外的所有字段?

我可以想到几种方法,但我不知道语法..我可以选择所有字段名称,然后为每个字段取消设置字段。有点像这样:

[Some query to find all field names under "field_to_prune" for id 123].forEach(function(i) { 
var key = "field_to_prune." + i;
print("removing field: " + key);
var mod = {"$unset": {}};
mod["$unset"][key] = "";

db.myCollection.update({ _id: "123" }, mod);
});

我想到的另一种方法是取消设置字段名称不在我定义的字符串数组中的位置。也不知道该怎么做。有什么想法吗?

最佳答案

如果你不关心原子性,那么你可以使用save来做到这一点:

doc = db.myCollection.findOne({"_id": 123});
for (k in doc.field_to_prune) {
if (k === 'keep_field_1') continue;
if (k === 'keep_field_2') continue;
delete doc.field_to_prune[k];
}
db.myCollection.save(doc);

这个解决方案的主要问题是它不是原子的。因此,在 findOnesave 之间对 doc 的任何更新都将丢失。

替代方法是实际取消设置所有不需要的字段,而不是保存文档:

doc = db.myCollection.findOne({"_id": 123});
unset = {};
for (k in doc.field_to_prune) {
if (k === 'keep_field_1') continue;
if (k === 'keep_field_2') continue;
unset['field_to_prune.'+k] = 1;
}
db.myCollection.update({_id: doc._id}, {$unset: unset});

这个解决方案要好得多,因为 mongo 以原子方式运行 update,因此不会丢失任何更新。而且您不需要另一个集合来完成您想要的操作。

关于mongodb - 如何取消设置除一组已知字段之外的所有字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19459086/

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