我有一个包含大量文档的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);
}
});
目前可以使用。但是我仍然想知道更好的一种,以防我需要再次做这样的事情。所以我不会把自己的解决方案作为答案