MongoDB C # Драйвер, как обновить коллекцию обновленных документов - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть база данных 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);
    }
});

Пока работает. Но я все еще хотел бы знать лучший вариант на случай, если мне понадобится сделать что-то подобное снова. Так что я не ставлю свое решение в качестве ответа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...