MongoDB C#驱动程序如何更新已更新文档的集合

时间:2018-09-09 13:16:18

标签: c# mongodb

我有一个包含大量文档的Mongo数据库。所有文档都有一个名为“源”的字段,其中包含文档的原始名称。但是许多旧文档的此字段包含“ null”(因为到那时我还没有源)字符串值。我想选择所有这些文档,并通过从上述文档的其他字段中解析的新值替换其“ source =“ null””值来解决此问题。 这是我要解决的问题:

public void FixAllSources() {
    Task.Run(async ()=> {  

        var filter = Builders<BsonDocument>.Filter.And(new List<FilterDefinition<BsonDocument>>() {
            Builders<BsonDocument>.Filter.Exists("url"),
            Builders<BsonDocument>.Filter.Ne("url", BsonNull.Value), 
            Builders<BsonDocument>.Filter.Eq("source", "null")
        });

        var result = await m_NewsCollection.FindAsync(filter);
        var list = result.ToList();

        list.ForEach(bson => {
            bson["source"] = Utils.ConvertUrlToSource(bson["url"].AsString);
        });

    });
}

如您所见,我正在获取所有这些文档,并将它们的源字段替换为新值。因此,现在我有了一个正确的BsonDocuments列表,需要将其放回到数据库中。 不幸的是,我一直坚持下去。问题是所有的“更新”方法都需要过滤器,我不知道应该在那儿传递什么过滤器。我只需要放回所有这些更新的文档即可,仅此而已。 我将不胜感激:)

ps.s。 我想出了一个丑陋的解决方案,像这样:

list.ForEach(bson => {
    bson["source"] = Utils.ConvertUrlToSource(bson["url"].AsString);
    try {
        m_NewsCollection.UpdateOne( new BsonDocument("unixtime", bson["unixtime"]), new BsonDocument {{"$set", bson}},
            new UpdateOptions {IsUpsert = true});
    }
    catch (Exception e) {
        WriteLine(e.StackTrace);
    }
});

目前可以使用。但是我仍然想知道更好的一种,以防我需要再次做这样的事情。所以我不会把自己的解决方案作为答案

0 个答案:

没有答案