Pokazywanie postów oznaczonych etykietą ravendb. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą ravendb. Pokaż wszystkie posty

poniedziałek, 11 marca 2013

[NoSQL] RavenDB: Queries

Provider LINQ dla RavenDb implementuje interfejs IQueryable<T>, co oznacza między innymi, że zbudowanie zapytania nie jest tożsame z zapytaniem do bazy. Dane pobierane są w momencie materializacji, czyli np. gdy wywołamy na obiekcie IQueryable funkcje ToArray, ToList, First, Last, Take itd.
using (var session = store.OpenSession())

{

    var audi = from car in session.Query<Car>()

               where car.Make.StartsWith("Audi")

               select car;

    MessageBox.Show(String.Format("Audi count: {0}", audi.Count()));

}

W zapytaniach można także używać agregatów, np do policzenia średniej:
using (var session = store.OpenSession())

{

    var avg = session.Query<Car>().ToArray().Average(c => c.Price);

    MessageBox.Show(String.Format("Average Price: {0}",avg));

}

Nic nie stoi także na przeszkodzie, by używać projekcji - mechanizmu, w którym pobieramy tylko fragment dokumentu z bazy o takich polach jakie sobie wybierzemy w typie anonimowym. Należy pamiętać, że zmiany na takich obiektach nie będą śledzone przez klienta i nie zostaną uwzględnione przy operacji SaveChanges().
using (var session = store.OpenSession())

{

    var bestengines = (from car in session.Query<Car>()

                       orderby car.EnginePower descending

                       select new {car.Make, car.EnginePower}).Take(5);

    var s = Enumerable.Aggregate(bestengines, "",

        (current, bestengine) => current + (bestengine.Make + ", " + bestengine.EnginePower + "\n"));

    MessageBox.Show(String.Format("Best engines: {0}", s));

}

Klient Ravena wspiera także paginację, a więc możemy pobierać dane porcjami z bazy za pomocą operatorów Skip i Take
var bestengines = (from car in session.Query<Car>()
orderby car.EnginePower descending
select new { car.Make, car.EnginePower }).Skip(5).Take(5);

wtorek, 5 marca 2013

[NoSQL] RavenDB: CRUD

W tym poście przedstawione zostaną podstawowe operacje dodawania, odczytu, usuwania i modyfikowania dokumentów składowanych w bazie RavenDB.

Dostęp do API RavenDB uzyskujemy instalując w naszym projekcie klienckie dll-ki Ravena. Najprościej zrobić to przy użyciu managera pakietów NuGet.


Podczas CRUDowych operacji korzysta się z wzorca Unit of Work, to znaczy operacje wykonywane są na obiekcie sesji, a wszystkie zmiany wędrują do serwera przy wywołaniu instrukcji SaveChanges. 

Każdą sesję otwiera obiekt typu IDocumentStore, którego inicjalizację najlepiej wykonać raz, na początku pracy programu, na przykład korzystając ze wzorca singletonu.

public class CarsStore
{
    public static DocumentStore Instance
    {
        get { return NestedClass.instance; }
    }

    public class NestedClass
    {
        static NestedClass()
        {
            var store = new DocumentStore()
                {
                    Url = "http://localhost:8080", 
                    DefaultDatabase = "RavenTest"
                };
            store.Initialize();
            instance = store;
        }

        internal static readonly DocumentStore instance;
    }
}

Dodanie pojedynczego obiektu jest bardzo proste:

var store = CarsStore.Instance;
using (IDocumentSession session = store.OpenSession())
{
    session.Store(new Car()
    {
        EnginePower = powerVal,
        Make = make.Text,
        Price = priceVal,
        Rating = ratingVal
    });
    session.SaveChanges();
}

gdzie Car jest obiektem POCO (zawierającym jedynie propercje, serializowane następnie do JSONa).
Wyniki operacji można oglądać w Management Studio RavenDB, dostępnego w przeglądarce.


Odczyt danych, odbywa się za pomocą zapytań LINQ. Do usuwania z kolecji służy specjalna metoda Delete  z obiektu sesji. Update' ować wystarczy obiekty POCO, ponieważ są one śledzone przez sesję i zmiany lądują w bazie w momencie wywołania SaveChanges.

var store = CarsStore.Instance;
using (var session = store.OpenSession())
{
    var cars = session.Query<Car>().ToArray();

    foreach (var car in cars.Where(c => c.Rating < thresholdVal))
    {
        session.Delete(car);
    }

    foreach (var car in cars.Where(c => c.Rating >= thresholdVal))
    {
        car.Price += 1000;
    }
    session.SaveChanges();
}

niedziela, 3 marca 2013

[NoSQL] RavenDB : Wprowadzenie

Bazy NoSQL, a więc takie, w których przeważnie nie ma tabel i zapytań SQL-owych, stają się w ostatnim czasie coraz częściej używane. Jedną z takich baz, napisaną w .NET jest RavenDB.  Baza ta składuje dane w postaci dokumentów zapisywanych w formacie JSON. Każdy dokument posiada unikalny identyfikator, będący jednocześnie jego adresem URL. Do dokumentów można załączać dodatkowo pliki binarne, takie jak na przykład zdjęcia.

Kilka zalet przemawiających za skorzystaniem z RavenDB, to na pewno mniejszy nakład pracy na operacje CRUD w porównaniu z bazami relacyjnymi, bardzo dobra skalowalność, szybkość dostępu do danych i możliwość tworzenia baz rozproszonych dzięki technologii shardingu. Brak schematu wprowadza sporą elastyczność. Ponadto, aby pobierać dane, nie potrzebujemy żadnych narzędzi ORM, zapytania pisane są w specjalnej wersji LINQ.

Po stronie serwerowej szybki dostęp do danych uzyskiwany jest dzięki mechanizmowi indeksów. Indeksy w RavenDB tworzone są w tle, nie wpływają więc na szybkość pojedynczej informacji.

Aby rozpocząć pracę z RavenDB, wystarczy pobrać pliki z tej strony, Po rozpakowaniu folderu, do uruchomienia serwera RavenDB, wystarczy uruchomić plik Start.cmd. Jeżeli wszystko pójdzie po naszej myśli, to serwer zostanie uruchomiony na porcie 8080. Oczywiście pod warunkiem, że port ten jest zwolniony w chwili uruchomienia serwera RavenDB.

Wpisując w przeglądarce nazwę komputera, na którym pracuje serwer RavenDB i odpowiedni port, uzyskujemy dostęp do narzędzi służących do zarządzania bazą, gdzie mamy możliwość modyfikacji danych, oglądania statystyk, przeglądania logów itd.