-
c# 에서 mongodb를 다루는 방법프로그래밍 2024. 11. 19. 16:25
C#에서 mongodb는 필자가 경험한바, 2가지로 다룰 수 있다.
하나는 Mongodb.Driver를 사용하는 것이요,
하나는 Mongodb.EntityFrameworkCore를 사용하는 것이다.
이 두 가지 개발 경험을 공유하고자 한다.
먼저, 결론적으로 Mongodb.Driver를 사용해서 개발하기를 추천한다.
Mongodb.Driver를 사용해서 개발하는 예는 아래와 같다.
1. collection 생성 및 index
var client = scope.ServiceProvider.GetRequiredService<IMongoClient>(); var db = client.GetDatabase(ENUM_MONGODB_DATABASE_TYPE.Demo.Name); await db.CreateCollectionAsync(MongoDbCollections.Event); var eventCol = db.GetCollection<EventObject>(MongoDbCollections.Event); var keys = Builders<EventObject>.IndexKeys.Ascending(m => m.A) .Ascending(m => m.B) .Ascending(m => m.C); var index = new CreateIndexModel<EventObject>(keys, new CreateIndexOptions() { Unique = false }); await eventCol.Indexes.CreateOneAsync(index);
mongodb는 최초 데이터가 생성될 경우에 자동으로 collection을 생성하지만 위와 같이 collection 생성 후 index를 생성할 수도 있다. 따라서, 초기화 및 index 생성을 할 경우 위와 같이 초기화 할 수 있다.
2. 조회
var client = scope.ServiceProvider.GetRequiredService<IMongoClient>(); var database = client.GetDatabase(ENUM_MONGODB_DATABASE_TYPE.HealthCare.Name); var collection = database.GetCollection<LogObject>(MongoDbCollections.Log); var exists = await collection.AsQueryable().FirstOrDefaultAsync(m => m.A == payload.A && m.P == payload.P && m.M == payload.M, cancellationToken: _stoppingToken);
3. 수정
var log = await collection.AsQueryable().FirstOrDefaultAsync(m => m._id == id); log.IsBatch = true; log.ModifiedBy = "SYSTEM"; log.ModifiedOn = DateTime.UtcNow; var filter = Builders<LogObject>.Filter.Eq(x => x._id, log._id); await collection.ReplaceOneAsync(filter, log, cancellationToken: stoppingToken);
4. 삽입
var newItem = new LogObject() { Log = [text], CreateBy = "SYSTEM", CreateOn = now }; await collection.InsertOneAsync(newItem, null, _stoppingToken);
5. 삭제
var removeFilter = Builders<LogObject>.Filter.Eq(m => m._id, exists._id); await collection.DeleteOneAsync(removeFilter, _stoppingToken);
또한 수정 및 삽입, 삭제는 다건 수정, 삽입, 삭제를 지원한다.
문제는 Mongodb EntityFrameworkCore는 집계 함수를 사용할 수 없다는 것이다.
정상적으로 동작하는 함수는 Max, Min, Count 정도가 되겠다.
또한, 제일 큰 문제는 Mongo.Driver.Linq의 확장 메서드와 Mongodb.EntityFrameworkCore의 Linq 확장 메서드가 호환이 불가능하다는 점이다.
예는 아래와 같다.
var database = client.GetDatabase("demo-db"); var dbcontext = MongodbContext.Create(database); var exists = await dbcontext.Samaples.Where(m => m.Name == "test").ToListAsync();
코드가 위와 같을 때 ToListAsync가 Mongodb.Driver.Linq일 경우 오류가 발생한다.
따라서, 기능적으로 Mongodb.Driver가 제공해 주는 기능이 많고 Mongodb Native이므로 Mongodb를 사용할 경우 현재까지는 EntityFrameworkCore를 사용하지 않는 것이 좋겠다.
도움이 되기를 바라면...
'프로그래밍' 카테고리의 다른 글
AWS Secret Manager를 이용한 반복 체크 (0) 2024.11.21 c# 에서 mongodb를 다루는 방법 (2) (0) 2024.11.20 Kafka Consumer를 조금 더 효율적으로 처리하는 방법 (0) 2024.11.13 시계열 데이터를 전송하는 방법 (0) 2024.10.25 사용자 Session을 처리하는 방법 (1) 2024.10.24