Работаем с MongoDB из C#

суббота, 20 марта 2010, Kos

Введение

MongoDB очень быстрая NoSQL  документоориентированная СУБД, есть множество обзоров её производительности, некоторые говорят что она лучше, некоторые говорят что хуже. Я не буду никого убеждать, скажу для меня она лучше (я не знаю как настроить SQL СУБД для того что бы 5 миллионов записей/транзакций со связями между 2-3 таблицами для каждой записи можно было добавить меньше чем за сутки на обычном железе, может Вы знаете, тогда эта статья не для Вас ))) ). Из NoSQL, монго примечательна встроенными средствами для кластеризации, живым сообществом, где всегда можно спросить совета, попросить добавить новую функцию, а иногда и поспорить с разработчиками о спорных архитектурных решениях. Кстати о архитектурных решениях - монго быстрая именно благодаря им, так как не ведёт никаких логов на жёстком диске, и сбрасывает информацию на диск блоками раз в 60 секунд, есть возможность указать СУБД что нужно сбросить данные сейчас. Обратная сторона медали - надёжности от монго работающей на одной машине ждать не стоит. Я честно говоря горд тем что год назад додумался и реализовал подобную схему в своей курсовой работе  .

Выбираем драйвер 

 Я попробовал на зуб два драйвера Simple-MongoDB и MongoDB-CSharp, первый использует распространённую библиотеку для работы с JSON/BSON Newtonsoft.JSON и понимает её атрибуты для полей Ваших классов, но требует .net 4.0 DLR , второй отличается хорошей поддержкой, .net 2.0+ и в отличии от первого не понимает встроенных типов. Например Вы используете в одном своём типе - поля другого Вашего типа :

public class YourType { 
  
[JsonProperty(PropertyName = "um")] 
 public Mark[] UsersMarks; 
 } 
 [JsonObject(Title = "Mrk")] 
 public class Mark 
 { 
 [JsonProperty(PropertyName = "t")] 
 public long tid; 
 [JsonProperty(PropertyName = "m")] 
 public float mark = 0.1f; 
 }

 Примеры использования драйверов

Первый:

var cn = new SimoConnection( 
new SimoConnectionInfo("localhost", 27017)); 
var session = new SimoSession(cn); 
var db = session["MyDb"]; 
var Users = db["Users"]; 
var p = new 
{ 
un = userName, 
pw = passWord 
};//переменная анонимного типа 
var u = Users.FindOne<User>(p); 
return "Ok " + u._id.ToString();

Второй :

var dbms = new MongoDB.Driver.Mongo(); 
dbms.Connect(); 
var db1 = dbms.getDB("MyDb"); 
#region datadef 
var u = new User(); 
u._id = 2; 
u.Views =  new long[] { 1, 2, 3, 4, 5 }; 
u.About = "asfasdfasfasdfasdf"; 
u.userName = "uName"; 
u.Name = "name"; 
u.password = "password"; 
u.email = "bla@gmail.com"; 
u.friends = new string[]{"asf","sdfsdf"}; 
u.friendsIDs = new long[]{2,3}; 
  #endregion 
var su = JsonConvert.SerializeObject(u); 
Console.WriteLine(su); 
var coll1 = db1.GetCollection("Users"); 
var res = coll1.FindAll(); 
foreach ( var res2 in res.Documents) 
Console.WriteLine(res2.ToString()); 
var d = u.Serialize();// кладём данные в документ с помощью своей функции 
var u2 = new User(); 
u2.Deserialize(d);// достаём данные из документа с помощью своей функции 
coll1.Insert(d); 
var d2 = new Document(); 
d2.Add("_id",2); 
var bret = coll1.FindOne(d2); 
u2.Deserialize(bret); 
dbms.Disconnect(); 

В последнем примере использовались функции этого класса : 

public static class MyDocWrapper 
{ 
public static Document Serialize(this object obj) 
{ 
var d = new Document(); 
var type = obj.GetType(); 
var f = type.GetFields(); 
foreach (var e in f) 
{ 
    var str = e.FieldType.Name; 
    d.Add(e.Name, e.GetValue(obj)); 
} 
return d; 
} 
public static void Deserialize(this object obj,Document d) 
{ 
var type = obj.GetType(); 
var f = type.GetFields(); 
foreach (var e in f) 
{ 
  var str = e.FieldType.FullName; 
  e.SetValue(obj, d[e.Name]); 
  } 
} 
}

Вывод 

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


Ищите нас в интернетах!

Комментарии

Свежие вакансии