Как я могу сохранить всю коллекцию 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#.
После сериализации вы можете использовать драйвер для удаления коллекции. А после десериализации вы можете использовать драйвер для вставки объектов в новую коллекцию.
Исходя из ваших правил, вы можете захотеть сделать некоторую блокировку для этой коллекции во время процесса экспорта, прежде чем вы его отбросите.