У меня есть база данных Mongo с большим количеством документов. Все документы имеют поле с именем «источник», которое содержит имя источника документа. Но у многих старых документов есть это поле, содержащее строковое значение «ноль» (потому что у меня не было источника). Я хочу выбрать все эти документы и исправить эту проблему, заменив их значения "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, которые мне нужно вернуть в базу данных.
К сожалению, я застрял на этом. Проблема в том, что для всех методов «Обновление» требуются фильтры, и я не знаю, какие фильтры мне там проходить. Мне просто нужно вернуть все эти обновленные документы, и все.
Буду признателен за любую помощь:)
приписка
Я нашел уродливое решение, подобное этому:
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);
}
});
Пока работает. Но я все еще хотел бы знать лучший вариант на случай, если мне понадобится сделать что-то подобное снова. Так что я не ставлю свое решение в качестве ответа