출처 : 본인
아래 링크는 동기방식
2015/09/14 - [프로그램 자료/Visual C#] - [C# MongoDB] MongoDBHandle 어플리케이션에서 몽고디비 써보자
MongoDB C# .Net Driver 다운 경로
http://mongodb.github.io/mongo-csharp-driver/
https://github.com/mongodb/mongo-csharp-driver/releases
사용한 DLL 파일
아래의 메소드를 사용하려면 사용되는 Document(T object)에 IEntityBase라는 인터페이스를 상속받아야 한다.
public interface IEntityBase
{
ObjectId Id { get; set; }
}
public class Apple : IEntityBase
{
public ObjectId Id { get; set; }
public string Name { get; set; }
public string Memo { get; set; }
public int DongCode { get; set; }
public string SiDoName { get; set; }
public string SiGunGuName { get; set; }
}
이런 식으로 말이다.
using Mongo.Model;
using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace MongoWin_Async
{
class MongoDBHandler : IDisposable
{
private string connString { get; set; }
#region 생성자
public MongoDBHandler(string dbName)
{
this.connString = string.Format("mongodb://localhost/{0}", dbName);
}
public MongoDBHandler(string host, string dbName, string id, string pw, int port = 27017)
{
this.connString = string.Format("mongodb://{0}:{1}@{2}:{3}/{4}", id, pw, host, port, dbName);
}
#endregion
/// <summary>
/// ObjectId로 Document select
/// </summary>
/// <typeparam name="T">Document Type</typeparam>
/// <param name="collectionName"></param>
/// <param name="obj"></param>
/// <returns></returns>
public async Task<T> SelectOne<T>(string collectionName, ObjectId id) where T : IEntityBase
{
try
{
var Collections = GetDatabase().GetCollection<T>(collectionName);
return await Collections.Find(x => x.Id == id).SingleAsync();
}
catch (Exception x)
{
throw new Exception(x.Message);
}
}
/// <summary>
/// Document로 Document select(내부에선 ObjectID로 동작)
/// </summary>
/// <typeparam name="T">Document Type</typeparam>
/// <param name="collectionName"></param>
/// <param name="obj"></param>
/// <returns></returns>
[Obsolete("해당 개체를 가지고 있으므로 사용할 필요가 없습니다.")]
public async Task<T> SelectOne<T>(string collectionName, T obj) where T : IEntityBase
{
try
{
var Collections = GetDatabase().GetCollection<T>(collectionName);
return await Collections.Find(x => x.Id == obj.Id).SingleAsync();
}
catch (Exception x)
{
throw new Exception(x.Message);
}
}
/// <summary>
/// select 함수
/// </summary>
/// <typeparam name="T">Document Type</typeparam>
/// <param name="collectionName"></param>
/// <param name="jsonFilter">Where Conditions</param>
/// <param name="orderBy"></param>
/// <returns></returns>
public async Task<List<T>> Select<T>(string collectionName, string jsonFilter, Dictionary<string, MongoOrderBy> orderBy = null) where T : IEntityBase
{
try
{
var Collections = GetDatabase().GetCollection<T>(collectionName);
if (orderBy != null)
return await Collections.Find(GetFilter(jsonFilter)).Sort(GetOrderBy(orderBy)).ToListAsync();
else
return await Collections.Find(GetFilter(jsonFilter)).ToListAsync();
}
catch (Exception x)
{
throw new Exception(x.Message);
}
}
/// <summary>
/// Insert 함수
/// </summary>
/// <typeparam name="T">Document Type</typeparam>
/// <param name="collectionName"></param>
/// <param name="obj"></param>
/// <returns></returns>
public async Task Insert<T>(string collectionName, T obj) where T : IEntityBase
{
try
{
var Collections = GetDatabase().GetCollection<T>(collectionName);
await Collections.InsertOneAsync(obj);
}
catch (Exception x)
{
throw new Exception(x.Message);
}
}
/// <summary>
/// ObjectID를 통한 Update
/// </summary>
/// <typeparam name="T">Document Type</typeparam>
/// <param name="collectionName"></param>
/// <param name="updateItems"></param>
/// <param name="id"></param>
/// <returns></returns>
public async Task<UpdateResult> UpdateById<T>(string collectionName, IDictionary<string, object> updateItems, ObjectId id) where T : IEntityBase
{
try
{
var Collections = GetDatabase().GetCollection<T>(collectionName);
var update = new UpdateDocument { { "$set", new BsonDocument(updateItems) } };
return await Collections.UpdateOneAsync(x => x.Id == id, update);
}
catch (Exception x)
{
throw new Exception(x.Message);
}
}
/// <summary>
/// Document를 통한 Document Update(내부에선 ObjectID로 동작)
/// </summary>
/// <typeparam name="T">Document Type</typeparam>
/// <param name="collectionName"></param>
/// <param name="obj"></param>
/// <returns></returns>
public async Task<ReplaceOneResult> UpdateById<T>(string collectionName, T obj) where T : IEntityBase
{
try
{
var Collections = GetDatabase().GetCollection<T>(collectionName);
return await Collections.ReplaceOneAsync(x => x.Id == obj.Id, obj);
}
catch (Exception x)
{
throw new Exception(x.Message);
}
}
/// <summary>
/// 해당 Document로 전체 데이터 업데이트(Id 제외, null 포함)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="collectionName"></param>
/// <param name="obj"></param>
/// <param name="jsonFilter"></param>
/// <returns></returns>
public async Task<UpdateResult> Update<T>(string collectionName, T obj, string jsonFilter) where T : IEntityBase
{
try
{
var Collections = GetDatabase().GetCollection<T>(collectionName);
Dictionary<string, object> updateItems = new Dictionary<string, object>();
PropertyInfo[] prop = typeof(T).GetProperties();
foreach (PropertyInfo p in prop)
{
if (p.Name != "Id")
{
updateItems.Add(p.Name, p.GetValue(obj, null));
}
}
var update = new UpdateDocument { { "$set", new BsonDocument(updateItems) } };
return await Collections.UpdateManyAsync(GetFilter(jsonFilter), update);
}
catch (Exception x)
{
throw new Exception(x.Message);
}
}
/// <summary>
/// Update 함수
/// </summary>
/// <typeparam name="T">Document Type</typeparam>
/// <param name="collectionName"></param>
/// <param name="updateItems"></param>
/// <param name="jsonFilter">Where Conditions</param>
/// <returns></returns>
public async Task<UpdateResult> Update<T>(string collectionName, IDictionary<string, object> updateItems, string jsonFilter) where T : IEntityBase
{
try
{
var Collections = GetDatabase().GetCollection<T>(collectionName);
var update = new UpdateDocument { { "$set", new BsonDocument(updateItems) } };
return await Collections.UpdateManyAsync(GetFilter(jsonFilter), update);
}
catch (Exception x)
{
throw new Exception(x.Message);
}
}
/// <summary>
/// ObjectID로 Document Delete
/// </summary>
/// <typeparam name="T">Document Type</typeparam>
/// <param name="collectionName"></param>
/// <param name="id"></param>
/// <returns></returns>
public async Task<DeleteResult> DeleteById<T>(string collectionName, ObjectId id) where T : IEntityBase
{
try
{
var Collections = GetDatabase().GetCollection<T>(collectionName);
return await Collections.DeleteOneAsync(x => x.Id == id);
}
catch (Exception x)
{
throw new Exception(x.Message);
}
}
/// <summary>
/// Delete 함수
/// </summary>
/// <typeparam name="T">Document Type</typeparam>
/// <param name="collectionName"></param>
/// <param name="jsonFilter">Where Conditions</param>
/// <returns></returns>
public async Task<DeleteResult> Delete<T>(string collectionName, string jsonFilter) where T : IEntityBase
{
try
{
var Collections = GetDatabase().GetCollection<T>(collectionName);
return await Collections.DeleteManyAsync(GetFilter(jsonFilter));
}
catch (Exception x)
{
throw new Exception(x.Message);
}
}
#region Private Method
private IMongoDatabase GetDatabase()
{
var client = new MongoClient(connString);
return client.GetDatabase(MongoUrl.Create(connString).DatabaseName);
}
private SortByDocument GetOrderBy(Dictionary<string, MongoOrderBy> orderBy)
{
return new SortByDocument(orderBy);
}
private PropertyInfo GetProperty(object obj, string propertyName)
{
Type t = obj.GetType();
PropertyInfo prop = t.GetProperty(propertyName);
return prop;
}
/// <summary>
/// 해당 Document의 string 속성값 가져오기
/// </summary>
/// <param name="obj"></param>
/// <param name="propertyName"></param>
/// <returns></returns>
private string GetStringValue(object obj, string propertyName)
{
PropertyInfo prop = GetProperty(obj, propertyName);
return (string)prop.GetValue(obj, null);
}
/// <summary>
/// 해당 Document의 int 속성값 가져오기
/// </summary>
/// <param name="obj"></param>
/// <param name="propertyName"></param>
/// <returns></returns>
private int GetIntValue(object obj, string propertyName)
{
PropertyInfo prop = GetProperty(obj, propertyName);
return (int)prop.GetValue(obj, null);
}
/// <summary>
/// Document의 ID 가져오기
/// </summary>
/// <param name="obj"></param>
/// <param name="propertyName">Id</param>
/// <returns></returns>
private ObjectId GetId(object obj)
{
ObjectId id;
try
{
PropertyInfo prop = GetProperty(obj, "Id");
id = (ObjectId)prop.GetValue(obj, null);
}
catch
{
id = new ObjectId();
}
return id;
}
private QueryDocument GetFilter(string jsonFilter)
{
return new QueryDocument(BsonDocument.Parse(jsonFilter));
}
#endregion
public void Dispose()
{
GC.SuppressFinalize(this);
}
}
public enum MongoOrderBy
{
Ascending = 1,
Descending = -1
}
}