微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 如何为文档加载取消设置字段?

我有一个完全动态的巨大表(没有映射到任何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 } }

(更新表达式中的值2无关紧要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,options);
if (updateResults != null)
{                
    Console.WriteLine(updateResults);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐