2016년 12월 20일 화요일

Document CRUD - Read

Tags



All

  • collection.all()
all은 cursor를 반환한다. cursor는 toArray를 통해 모든 리스트를 볼 수 있고, next, hasNext등으로 하나씩 결과를 볼 수 있다.
arangosh> db.five.save({ name : "one" });
{ 
  "_id" : "five/103", 
  "_key" : "103", 
  "_rev" : "_UOaqyO----" 
}
arangosh> db.five.save({ name : "two" });
{ 
  "_id" : "five/107", 
  "_key" : "107", 
  "_rev" : "_UOaqyOG---" 
}
arangosh> db.five.save({ name : "three" });
{ 
  "_id" : "five/110", 
  "_key" : "110", 
  "_rev" : "_UOaqyOK---" 
}
arangosh> db.five.save({ name : "four" });
{ 
  "_id" : "five/113", 
  "_key" : "113", 
  "_rev" : "_UOaqyOK--_" 
}
arangosh> db.five.save({ name : "five" });
{ 
  "_id" : "five/116", 
  "_key" : "116", 
  "_rev" : "_UOaqyOK--A" 
}
arangosh> db.five.all().toArray();
[ 
  { 
    "_key" : "107", 
    "_id" : "five/107", 
    "_rev" : "_UOaqyOG---", 
    "name" : "two" 
  }, 
  { 
    "_key" : "116", 
    "_id" : "five/116", 
    "_rev" : "_UOaqyOK--A", 
    "name" : "five" 
  }, 
  { 
    "_key" : "113", 
    "_id" : "five/113", 
    "_rev" : "_UOaqyOK--_", 
    "name" : "four" 
  }, 
  { 
    "_key" : "103", 
    "_id" : "five/103", 
    "_rev" : "_UOaqyO----", 
    "name" : "one" 
  }, 
  { 
    "_key" : "110", 
    "_id" : "five/110", 
    "_rev" : "_UOaqyOK---", 
    "name" : "three" 
  } 
]

결과의 개수를 제한하기 위해 limit과 skip을 활용한다.
arangosh> db.five.save({ name : "one" });
{ 
  "_id" : "five/123", 
  "_key" : "123", 
  "_rev" : "_UOaqyPW---" 
}
arangosh> db.five.save({ name : "two" });
{ 
  "_id" : "five/127", 
  "_key" : "127", 
  "_rev" : "_UOaqyPa---" 
}
arangosh> db.five.save({ name : "three" });
{ 
  "_id" : "five/130", 
  "_key" : "130", 
  "_rev" : "_UOaqyPa--_" 
}
arangosh> db.five.save({ name : "four" });
{ 
  "_id" : "five/133", 
  "_key" : "133", 
  "_rev" : "_UOaqyPa--A" 
}
arangosh> db.five.save({ name : "five" });
{ 
  "_id" : "five/136", 
  "_key" : "136", 
  "_rev" : "_UOaqyPa--B" 
}
arangosh> db.five.all().limit(2).toArray();
[ 
  { 
    "_key" : "136", 
    "_id" : "five/136", 
    "_rev" : "_UOaqyPa--B", 
    "name" : "five" 
  }, 
  { 
    "_key" : "127", 
    "_id" : "five/127", 
    "_rev" : "_UOaqyPa---", 
    "name" : "two" 
  } 
]

Query by Example

  • collection.byExample(example)
  • collection.byExample(path, value, ...)
JSON 값으로 조회하는 기능이다.
arangosh> db.users.save({ name: "Gerhard" });
{ 
  "_id" : "users/143", 
  "_key" : "143", 
  "_rev" : "_UOaqyQC---" 
}
arangosh> db.users.save({ name: "Helmut" });
{ 
  "_id" : "users/147", 
  "_key" : "147", 
  "_rev" : "_UOaqyQG---" 
}
arangosh> db.users.save({ name: "Angela" });
{ 
  "_id" : "users/150", 
  "_key" : "150", 
  "_rev" : "_UOaqyQG--_" 
}
arangosh> db.users.all().toArray();
[ 
  { 
    "_key" : "147", 
    "_id" : "users/147", 
    "_rev" : "_UOaqyQG---", 
    "name" : "Helmut" 
  }, 
  { 
    "_key" : "143", 
    "_id" : "users/143", 
    "_rev" : "_UOaqyQC---", 
    "name" : "Gerhard" 
  }, 
  { 
    "_key" : "150", 
    "_id" : "users/150", 
    "_rev" : "_UOaqyQG--_", 
    "name" : "Angela" 
  } 
]
arangosh> db.users.byExample({ "_id" : "users/20" }).toArray();
[ ]
arangosh> db.users.byExample({ "name" : "Gerhard" }).toArray();
[ 
  { 
    "_key" : "143", 
    "_id" : "users/143", 
    "_rev" : "_UOaqyQC---", 
    "name" : "Gerhard" 
  } 
]
arangosh> db.users.byExample({ "name" : "Helmut", "_id" : "users/15" }).toArray();
[ ]
아래와 같이 cursor를 담아두고 하나씩 print할 수도 있다.
arangosh> var a = db.users.byExample( {"name" : "Angela" } );
arangosh> while (a.hasNext()) print(a.next());
{ 
  "_key" : "170", 
  "_id" : "users/170", 
  "_rev" : "_UOaqyQ6--_", 
  "name" : "Angela" 
}
byExample을 사용한 검색은 equals 매칭이다.
예를 들어 아래와 같은 document로 byExample 검색을 한다면

{ "a" : { "c" : 1 } }
{ "a" : { "c" : 1 }, "b" : 1 } //이것은 find 될 것이다.
{ "a" : { "c" : 1, "b" : 1 } } //이것은 해당되지 않는다.
그런데 field에 .(dot)는 path로 해석되는데 아래와 같은 example로 찾게 된다면 a attribute의 c attribute 값이 1인 것을 찾는다.
{ "a.c" : 1 }
위 두 경우 모두 찾을 수 있다.
{ "a" : { "c" : 1 }, "b" : 1 } //found

{ "a" : { "c" : 1, "b" : 1 } } //found

 array를 찾고자 한다면 array가 통째로 일치해야 한다.

두 번째 signiture로 할 경우 예제는 아래와 같다. path에서 .(dot)를 path로 인식한다.

path가 없으면 전체 리스트의 cursor객체를 리턴한다.


아래는 일치하는 하나만 리턴한다. MongoDB에서 findOne과 유사하다.
  • collection.firstExample(path, value1, ...)
일치하는 것 중 첫 번째만 return한다.
일치하는게 없다면 null이 리턴된다.
순서를 지정하지 않을 경우 어떤 것이 첫 번째가 되는지는 알 수 없다.

Any

collection에서 아무 document나 리턴한다. collection이 비어있다면 null을 return한다. 신박한 기능이다.
  • collection.any()
any의 결과는 매번 호출할 때마다 다르다.

Count

collection에서 document의 수를 리턴한다.
  • collection.count();

Exist

document가 존재하는지 여부를 리턴한다.
  • collection.exists(object)
  • collection.exist(id or key)
  • collection.exist(array)
주어진 object의 _id나 _key로 존재하는지 판단한다. 둘 다 주어지면 _id로 먼저 판단한다. _id가 주어질 경우 _id의 collection과 평가하려는 collection이 일치하지 않을 경우 에러가 발생한다. _rev가 주어진 경우 _id나 _key로 검사하고 검색된 값이 주어진 _rev와 다르면 에러를 던진다. 만약 document가 검색되었을 경우 해당 document의 _id, _key, _rev가 리턴되며, 찾지 못할 경우 false가 리턴된다. 여러 개를 한꺼번에 평가할 경우 array로 전달한다. 만약 적절한 object 형태가 아니거나, id or key의 형식이 아니거나(빈 문자열 같은), 찾으려는 값이 속한 collection과 쿼리가 이루어지는 collection이 다르면 에러가 발생한다. array로 검색할 경우, 에러가 발생하면 즉시 멈추고 에러를 반환한다.

Lookup by keys

  • collection.documents(keys)
key 배열을 넘겨서 document를 찾아 리턴한다. document가 없는 key는 무시된다. 에러도 throw되지 않는다.

Lookup by key

_id, 혹은 _key로 찾을 때 사용한다. 둘 다 주어질 경우 _id로 먼저 찾는다. 주어진 _id의 collection명과 찾으려는 collection이 일치하지 않을 경우 에러가 발생한다.
  • collection.document(obj)
  • collection.document(key or _id)
  • collection.document(array)  //up to 3.x
_rev를 줄 수도 있는데 만약 _id or _key와 _rev을 주었는데 find 된 document(_id or key로 검색된)가 _rev가 다른 경우 error가 발생함. arangod server에서 실행되는 환경이라면(ex. Foxx app) 성능상의 이유로 immutable document가 반환되며 이 값의 속성들을 바꿀 수 없다. 바꾸고 싶다면 javascript object로 copy 후 사용해야 한다.

_id로 검색하는 예제
arangosh> db.example.document("example/2873916");
{ 
  "_key" : "2873916", 
  "_id" : "example/2873916", 
  "_rev" : "_UPtzFti---" 
}
 _key로 검색하는 예제
arangosh> db.example.document("2873916");
{ 
  "_key" : "2873916", 
  "_id" : "example/2873916", 
  "_rev" : "_UPtzFrO---" 
}
object로 검색하는 예제
arangosh> db.example.document({_id: "example/2873916"});
{ 
  "_key" : "2873916", 
  "_id" : "example/2873916", 
  "_rev" : "_UPtzFsK---" 
}

array로 검색하는 예제
arangosh> db.example.document(["2873916","2873917"]);
[ 
  { 
    "_key" : "2873916", 
    "_id" : "example/2873916", 
    "_rev" : "_UPtzFtC---" 
  }, 
  { 
    "_key" : "2873917", 
    "_id" : "example/2873917", 
    "_rev" : "_UPtzFtC--_" 
  } 
]
못 찾을 경우 에러
arangosh> db.example.document("example/4472917");
[ArangoError 1202: document not found]
잘못된 형식일 경우 에러
arangosh> db.example.document("");
[ArangoError 1205: illegal document handle]



Production에서는 절대 쓰지말아야 할 메소드

toArray

  • collection.toArray()
collection전체를 document array로 바꾼다. 모두 RAM에 올라가기 때문에 document 수에 따라 resource를 많이 잡아먹을 수도 있다.

@Deprecated method이지만 3.x까진 살아 있는 메소드

Range
Closed Range


EmoticonEmoticon

:)
:(
hihi
:-)
:D
=D
:-d
;(
;-(
@-)
:o
:>)
(o)
:p
:-?
(p)
:-s
8-)
:-t
:-b
b-(
(y)
x-)
(h)