Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为加载的文档取消设置字段?_C#_Mongodb_Mongodb .net Driver - Fatal编程技术网

C# 如何为加载的文档取消设置字段?

C# 如何为加载的文档取消设置字段?,c#,mongodb,mongodb-.net-driver,C#,Mongodb,Mongodb .net Driver,我有一个完全动态的巨大表(没有映射到任何POCO)。它有多个字段,其中一个名为two。对于ArchiveId设置为1的每个文档,如何删除此字段 我尝试获取所有项目,然后保存每个项目,但它给我错误。我怀疑db只是超时了或者其他什么,因为它正在工作和运行,因为之后我可以很好地获取记录 请注意,我有超过100万条记录,我正在使用的这种方法可能非常糟糕,但我不知道更好的方法 服务器实例localhost:27017不再连接 我试过的 public void DeleteFieldByArchiveId(

我有一个完全动态的巨大表(没有映射到任何POCO)。它有多个字段,其中一个名为
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)