RDBMS에서는 한 table 내의 모든 record 들의 column은 동일합니다.
MongoDB에서는 document 들의 field가 미리 정의되어 있지 않을 뿐더러
동일 collection 내의 document 들의 field들이 서로 다를 수 있습니다.
이런 것을 비정형 data라고 합니다.
앞의 posting에서 정형 data에 대해서는 미리 field 정의와 동일한 형태의 class를 생성 한 뒤 document를 해당 class의 객체로 선언하여 사용하였습니다.
* BsonDocument
비정형 document에서는 정형 document같이 class를 미리 선언 할 수가 없습니다.
그래서 BsonDocument 객체를 이용해서 data를 입출력합니다.
BsonDocument 객체는 key : value 의 pair 들을 포함하는 collection 이라고 생각하면 이해가 쉽게 될것입니다.
value 로는 string, int 등의 값 뿐만 아니라 배열, BsonDocument 도 가능합니다.
BsonDocument에 대한 member 및 method 들의 대한 자세한 정보는 API reference를 참조하시면 됩니다.
http://api.mongodb.org/csharp/1.0/html/3a31e174-4df4-91f3-6760-02078b53ddb1.htm
* 접속, 예제 Collection 및 FindAll
접속 및 collection 선언은 앞서 다룬 내용이라 생략하겠습니다.
그리고, 이번 posting에서는 타입 선언을 명시적으로 하지않고 그냥 var로 선언하겠습니다.
비정형 document에 대한 결과를 .ToList() 로 가져오면 List<BsonDocument> 형태로 저장됩니다. BsonDocument를 string 형태로 출력하려면 .ToJson()을 이용하면 됩니다.
var database = new MongoClient("mongodb://localhost").GetServer().GetDatabase("test"); // emp Collection var emp = database.GetCollection("emp"); var cEmp = emp.FindAll(); var lstEmp = cEmp.ToList(); foreach (var e in lstEmp) { Console.WriteLine(string.Format("{0}", e.ToJson())); }
미리 만들어놓은 emp collection에는 다음의 정보가 들어 있었습니다.
* Insert
BsonDocument를 하나 생성하여 .Insert() 메서드를 이용하면 됩니다.
var luna = new BsonDocument { { "name", "Luna" }, { "age", 19 } }; emp.Insert(luna);
* FindOne , query 생성
luna 를 BsonDocument로 선언했을 때는 name 과 age 에 대한 field만 생성하였지만,
insert 작업 후에는 _id 라는 field로 생성되었습니다.
BsonDocument 내의 특정 field 값을 가져오는 메서드는 .GetValue(필드명) 입니다.
.FindOne(query 객체) 를 사용하면 해당 조건에 맞는 document 1개만을 가져옵니다.
var queryLuna = Query.EQ("_id", luna.GetValue("_id")); var luna2 = emp.FindOne(queryLuna); Console.WriteLine("Luna : {0}", emp.FindOne(queryLuna).ToJson());
* Update
.Update() 메서드에 query 객체와 UpdateBuilder 객체를 전달하여 수행하면 됩니다.
emp.Update(queryLuna, Update.Set("age", 27)); Console.WriteLine("Luna : {0}", emp.FindOne(queryLuna).ToJson());
* Remove
설명이 필요 없을듯 합니다. 예제를 보시면 이해가 가능하실 겁니다.
var queryLuna2 = Query.EQ("name", "Luna"); emp.Remove(queryLuna2); var rl = emp.FindOne(queryLuna2); if (rl == null) Console.WriteLine("Luna isn't exist"); else Console.WriteLine("Luna : {0}", rl.ToJson());
* Find , query 조건 여러개
.Find() 메서드의 사용도 앞서 배운 정형 document와 별로 다르지 않습니다.
query 조건이 1개 이상인 경우에는 Query.AND() 또는 Query.OR() 메서드에 query 객체들을 전달하는 식으로 구현이 가능합니다.
Console.WriteLine(""); Console.WriteLine("sal > 2000"); Console.WriteLine(""); foreach (var e in emp.Find(Query.GT("sal", 2000)).ToList()) { Console.WriteLine(string.Format("{0}", e.ToJson())); } Console.WriteLine(""); Console.WriteLine("sal > 2000 and deptno = 20"); Console.WriteLine(""); var multiQuery = Query.And(Query.GTE("sal", 2000), Query.EQ("deptno", 20)); foreach(var e in emp.Find(multiQuery).ToList()) { Console.WriteLine(string.Format("{0}", e.ToJson())); }
* 예제 코드
* 실행 결과
댓글 없음:
댓글 쓰기