Как я могу сохранить всю коллекцию MongoDB в файл json/bson, используя C#?

У меня есть процесс, который сначала генерирует много данных, которые сохраняются в коллекцию mongoDB, затем данные анализируются, и, наконец, я хочу сохранить всю коллекцию в файл на диске и стереть коллекцию. Я знаю, что я мог бы сделать это легко с MongoDump.exe, но мне было интересно, есть ли способ сделать это прямо из C#? - Я имею в виду не запускать консольный прецесс с - но использовать некоторые функции, которые находятся внутри драйвера MOngo C#.

И, если это можно сделать - как бы я сделал обратную операцию в C#? - а именно: загрузка файла.bson в коллекцию?

2 ответа

Вот два метода, которые вы можете использовать для достижения этой цели:

public static async Task WriteCollectionToFile(IMongoDatabase database, string collectionName, string fileName)
{
    var collection = database.GetCollection<RawBsonDocument>(collectionName);

    // Make sure the file is empty before we start writing to it
    File.WriteAllText(fileName, string.Empty);

    using (var cursor = await collection.FindAsync(new BsonDocument()))
    {
        while (await cursor.MoveNextAsync())
        {
            var batch = cursor.Current;
            foreach (var document in batch)
            {
                File.AppendAllLines(fileName, new[] { document.ToString() });
            }
        }
    }
}

public static async Task LoadCollectionFromFile(IMongoDatabase database, string collectionName, string fileName)
{
    using (FileStream fs = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    using (BufferedStream bs = new BufferedStream(fs))
    using (StreamReader sr = new StreamReader(bs))
    {
        var collection = database.GetCollection<BsonDocument>(collectionName);

        string line;
        while ((line = sr.ReadLine()) != null)
        {
            await collection.InsertOneAsync(BsonDocument.Parse(line));
        }
    }
}

И вот пример того, как вы бы их использовали:

// Obviously you'll need to change all these values to your environment
var connectionString = "mongodb://localhost:27017";
var database = new MongoClient(connectionString).GetDatabase("database");
var fileName = @"C:\mongo_output.txt";
var collectionName = "collection name";

// This will save all of the documents in the file you specified
WriteCollectionToFile(database, collectionName, fileName).Wait();

// This will drop all of the documents in the collection
Task.Factory.StartNew(() => database.GetCollection(collectionName).DeleteManyAsync(new BsonDocument())).Wait();

// This will restore all the documents from the file you specified
LoadCollectionFromFile(database, collectionName, fileName).Wait();

Обратите внимание, что этот код был написан с использованием версии 2.0 драйвера MongoDB C#, который вы можете получить через Nuget. Кроме того, код чтения файла в LoadCollectionFromFile Метод был получен из этого ответа.

Вы можете использовать C# BinaryFormatter для сериализации объекта графа на диск. Также вы можете десериализовать обратно в граф объектов.

Сериализация: https://msdn.microsoft.com/en-us/library/c5sbs8z9%28v=VS.110%29.aspx

Десериализация: https://msdn.microsoft.com/en-us/library/b85344hz%28v=vs.110%29.aspx

Однако это не особенность драйвера mongodb или C#.

После сериализации вы можете использовать драйвер для удаления коллекции. А после десериализации вы можете использовать драйвер для вставки объектов в новую коллекцию.

Исходя из ваших правил, вы можете захотеть сделать некоторую блокировку для этой коллекции во время процесса экспорта, прежде чем вы его отбросите.

Другие вопросы по тегам