C# 如何为加载的文档取消设置字段?
我有一个完全动态的巨大表(没有映射到任何POCO)。它有多个字段,其中一个名为C# 如何为加载的文档取消设置字段?,c#,mongodb,mongodb-.net-driver,C#,Mongodb,Mongodb .net Driver,我有一个完全动态的巨大表(没有映射到任何POCO)。它有多个字段,其中一个名为two。对于ArchiveId设置为1的每个文档,如何删除此字段 我尝试获取所有项目,然后保存每个项目,但它给我错误。我怀疑db只是超时了或者其他什么,因为它正在工作和运行,因为之后我可以很好地获取记录 请注意,我有超过100万条记录,我正在使用的这种方法可能非常糟糕,但我不知道更好的方法 服务器实例localhost:27017不再连接 我试过的 public void DeleteFieldByArchiveId(
two
。对于ArchiveId
设置为1
的每个文档,如何删除此字段
我尝试获取所有项目,然后保存每个项目,但它给我错误。我怀疑db只是超时了或者其他什么,因为它正在工作和运行,因为之后我可以很好地获取记录
请注意,我有超过100万条记录,我正在使用的这种方法可能非常糟糕,但我不知道更好的方法
服务器实例localhost:27017不再连接
我试过的
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驱动程序中执行此查询?您可能会使服务器溢出。你有超过100万的记录,所以这可能就是它。 尝试添加
System.Threading.Thread.Sleep(ms);
对于ms,您必须查看需要多少。我会在50毫秒开始测试
对于测试,我将使用:
for (int ms = 50; ms < 1001; ms++)
{
try { DeleteFieldByArchiveId(id, field, ms); break; } catch { }
}
public void DeleteFieldByArchiveId(int id, string field, int TimeToWaitInMS)
{
var collection = _db.GetCollection("items");
collection.Find(Query.EQ("ArchiveId", id))
.ToList()
.ForEach(x =>
{
x[field] = null;
collection.Save(x);
System.Threading.Thread.Sleep(TimeToWaitInMS)
});
}
for(int-ms=50;ms<1001;ms++)
{
尝试{DeleteFieldByArchiveId(id,field,ms);break;}catch{}
}
public void DeleteFieldByArchiveId(int-id,字符串字段,int-TimeToWaitInMS)
{
var collection=_db.GetCollection(“项目”);
collection.Find(Query.EQ(“ArchiveId”,id))
托利斯先生()
.ForEach(x=>
{
x[字段]=空;
收集。保存(x);
系统.线程.线程.睡眠(时间等待毫秒)
});
}
我对C非常生疏,但是如果你想按照你的编辑所说的方式来做,那么试试这个:
MongoCollection<BsonDocument> items;
var query = new QueryDocument {
{ "ArchiveId", 1 }
};
var update = new UpdateDocument {
{ "$unset", new BsonDocument("two", "") }
};
BsonDocument update = items.Update(query, update, UpdateFlags.Multi);
MongoCollection项目;
var query=newquerydocument{
{“ArchiveId”,1}
};
var update=新更新的文档{
{“$unset”,新的BsonDocument(“两个”)}
};
BsonDocument update=items.update(查询、更新、UpdateFlags.Multi);
供参考:以下是使用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
值无关紧要)
完整示例:
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);
}
一共有多少货?你说的是一打还是一百万?是的,我可能会使用下面所述的计时器函数批量执行此操作。我不确定为什么代码被编辑为
new UpdateBuilder()。Unset
。虽然从技术上讲这是可行的,但它并不是必需的,因为静态方法Unset
做同样的事情,而是更简洁(并且遵循Query
的模式)。我已经更改了答案(并使用s添加了,以防不清楚使用了什么)。该update语句有效,但只更新了一个文档。要更新它们,请添加UpdateFlags.Multi
,如BsonDocument update=items.update(查询、更新、UpdateFlags.Multi)代码>