Vállalati Információs Rendszerek

NoSQL adatbázisok használata (CouchDB dokumentum alapú NoSQL adatbázis)

CoucDB URL: http://vir.inf.u-szeged.hu:5986

Couch DB Fauxton (web GUI): http://vir.inf.u-szeged.hu:5986/_utils (user: VIR, pass: VIRPass123)

Feladatok:

  • Böngészőben vagy curl segítségével töltsük be a CouchDB URL-t
  • Tanulmányozzuk át a Fauxton web felületet
In [1]:
>bash
curl http://vir.inf.u-szeged.hu:5986/
{"couchdb":"Welcome","uuid":"5fb2095a8edada03185f43b22f12e37f","version":"2.1.0","vendor":{"name":"The Apache Software Foundation"}}
  • Vegyük fel a szükséges Maven függőséget, és mentsünk el egy Foo objektumot, majd kérjük vissza
In [2]:
>java
%%loadFromPOM
<dependency>
    <groupId>org.lightcouch</groupId>
    <artifactId>lightcouch</artifactId>
    <version>0.1.8</version>
</dependency>
In [1]:
>java
public class Foo {

    private String _id;
    private String _rev;
    private int intField;
    private String stringField;	

    public String get_id() {
        return _id;
    }

    public void set_id(String _id) {
        this._id = _id;
    }

    public String get_rev() {
        return _rev;
    }

    public void set_rev(String _rev) {
        this._rev = _rev;
    }

    public int getIntField() {
        return intField;
    }

    public void setIntField(int intField) {
        this.intField = intField;
    }

    public String getStringField() {
        return stringField;
    }

    public void setStringField(String stringField) {
        this.stringField = stringField;
    }

    @Override
    public String toString() {
        return "Str: " + stringField + ", int: " + intField;
    }
}
In [19]:
>java
import org.lightcouch.CouchDbClient;
import org.lightcouch.Response;


CouchDbClient dbClient = new CouchDbClient("vir_db", true, "http", "vir.inf.u-szeged.hu", 5986, "VIR", "VIRPass123"); 

Foo foo = new Foo(); // Plain Java Object
foo.setIntField(33);
foo.setStringField("SSS");

Response response = dbClient.save(foo);
String docid = response.getId();

System.out.println(docid);
0bbfccb613b641d2b2e3283d8c25e386
  • Elemek keresése id alapján, módosítás, törlés
In [12]:
>java
foo = dbClient.find(Foo.class, docid);

foo.setStringField("KKK");
dbClient.update(foo);

boolean b = dbClient.contains(foo.get_id());
System.out.println(b);

foo = dbClient.find(Foo.class, docid);
System.out.println(foo.getStringField());

foo = dbClient.find(Foo.class, docid);
dbClient.remove(foo);
true
KKK
Out[12]:
Response [id=49f01b0dfea1466dab1f4cf5f5bd790c, rev=5-3ab61cde0e21a0286dfd17f3f00591fd]
  • Elemek típus szerinti lekérdezése view segítségével
In [13]:
>java
List<Foo> list = dbClient.view("ddoc/by_field")
    .includeDocs(true)
    .query(Foo.class);
list.forEach(System.out::println);
Str: MMM, int: 42
Str: KKK, int: 33
Str: KKK, int: 33
Str: null, int: 0
Str: null, int: 0
Str: KKK, int: 33
Str: null, int: 0
Str: KKK, int: 33
Str: KKK, int: 33
Str: null, int: 0
Str: null, int: 0
Str: KKK, int: 33
Str: KKK, int: 33
Str: KKK, int: 33
Str: SSS, int: 33
Str: KKK, int: 33
Str: KKK, int: 33
Str: SSS, int: 33
Str: KKK, int: 33
  • Saját nézet létrehozása JavaScript kód segítségével
In [14]:
>java
import org.lightcouch.DesignDocument;
import org.lightcouch.DesignDocument.MapReduce;

DesignDocument designDocument = new DesignDocument();
designDocument.setId("_design/mydesign");
designDocument.setLanguage("javascript");

MapReduce getSumOfKKKsMR = new MapReduce();
getSumOfKKKsMR.setMap(
  "function(doc) { "
   + "  emit(doc.stringField, doc.intField)"
   + "}");
getSumOfKKKsMR.setReduce(
  "function (key, values, rereduce) {"
    + "return sum(values)"
    + "}");

Map<String, MapReduce> view = new HashMap<>();
view.put("getSumOfKKKs", getSumOfKKKsMR);

designDocument.setViews(view);

dbClient.design().synchronizeWithDb(designDocument);

int count = dbClient.view("mydesign/getSumOfKKKs").key("KKK").queryForInt();
System.out.println(count);
363

Feladat:

  • Készítsünk egy új nézetet (view) map-reduce segítségével (5 pont)
    • Minden azonos stringField-ű elemet képezzünk le egy összetett értékre
    • Az érték a dokumentumok stringField-jének összeillesztett változata, ahol minden stringField-et annyiszor ismétlünk meg, amennyi az adott dokumentum intField értéke
      • Szeparátornak pedig a „#” karaktert használjuk
    • Pl.: adottak az alábbi dokumentumok
      • {stringField: „A”, intField: 2}
      • {stringField: „A”, intField: 1}
      • {stringField: „B”, intField: 1}
      • {stringField: „B”, intField: 3}
      • {stringField: „B”, intField: 2}
    •  Az eredmény a következő legyen (az összefűzött kulcsok sorrendje nem feltétlenül kell, hogy megegyezzen ezzel):
      • {key: „A”, value: „AA#A”}
      • {key: „B”, value: „B#BBB#BB”}