gpt4 book ai didi

c# - 如何为大量文档取消设置字段?

转载 作者:可可西里 更新时间:2023-11-01 09:23:18 25 4
gpt4 key购买 nike

我有一个完全动态的巨大表(未映射到任何 POCO)。它有多个字段,其中之一名为 two。如何为每个将 ArchiveId 设置为 1 的文档删除此字段?

我尝试获取所有项目然后保存每个项目,但它给了我错误。我怀疑 db 只是超时或其他原因,因为它正在工作和运行,因为之后我可以很好地获取记录。

请注意,我有超过 100 万条记录,我正在做的这种方法可能非常糟糕,但我不知道有什么更好的方法。

Server instance localhost:27017 is no longer connected.

我尝试过的

public void DeleteFieldByArchiveId(int id, string field)
{
var collection = _db.GetCollection("items");

collection.Find(Query.EQ("ArchiveId", id))
.ToList()
.ForEach(x =>
{
x[field] = null;
collection.Save(x);
});
}

编辑(我需要的)

db.items.update({ArchiveId: 1}, {$unset: {two : ""}}, {multi: true})

基本上,这就是我想要使用 C# mongo 驱动程序实现的目标。我刚刚在 RoboMongo 中测试了这个查询,它在大约 20 秒内从 1m 数据库中删除了所有字段,没有超时。如何在 C# mongo 驱动程序中执行此查询?

最佳答案

下面是使用 Update 类的静态 Unset 方法执行查询的 C# 方法:

IMongoQuery query = Query.EQ("Activity", 1);         
UpdateBuilder ub = Update.Unset("two");
MongoUpdateOptions options = new MongoUpdateOptions {
Flags = UpdateFlags.Multi
};
var updateResults = examples.Update(query, ub, options);

这导致:

query = { "Activity" : 1 }
update = { "$unset" : { "two" : 1 } }

(更新表达式中 two 的值无关紧要 per the documentation )。

完整示例:

using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Builders;

var client = new MongoClient(); // connect to localhost
var server = client.GetServer();
var test = server.GetDatabase("test");
var examples = test.GetCollection("examples");

var query = Query.EQ("Activity", 1);
var ub = Update.Unset("two");
var options = new MongoUpdateOptions {
Flags = UpdateFlags.Multi
};
var updateResults = examples.Update(query, ub, options);
if (updateResults != null)
{
Console.WriteLine(updateResults);
}

关于c# - 如何为大量文档取消设置字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20857452/

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