Skip to content

Instantly share code, notes, and snippets.

@mhafalir
Created April 11, 2012 20:37
Show Gist options
  • Select an option

  • Save mhafalir/2362330 to your computer and use it in GitHub Desktop.

Select an option

Save mhafalir/2362330 to your computer and use it in GitHub Desktop.
MongoDB-Repository-Sample
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Builders;
public class MongoObject
{
public ObjectId _id { get; set; }
}
public class MongoDataProvider
{
MongoServer server;
MongoDatabase database;
public MongoDataProvider()
: this("mongodb://localhost", "MongoRepoDb")
{
}
public MongoDataProvider(string connectionString, string databaseName)
{
server = MongoServer.Create(connectionString);
database = server.GetDatabase(databaseName);
}
public bool InsertObject<T>(T t) where T : MongoObject
{
var collection = GetCollection<T>();
var result = collection.Insert(t);
return result != null ? result.Ok : false;
}
public bool UpdateObject<T>(T t) where T : MongoObject
{
var query = Query.EQ("_id", t._id);
var collection = GetCollection<T>();
var bson = t.ToBsonDocument();
var update = new UpdateDocument(bson.Elements);
var result = collection.Update(query, update);
return result != null ? result.Ok : false;
}
public bool DeleteObject<T>(T t) where T : MongoObject
{
var collection = GetCollection<T>();
var query = Query.EQ("_id", t._id);
var result = collection.Remove(query);
return result != null ? result.Ok : false;
}
public T GetObject<T>(ObjectId _id) where T : MongoObject
{
var collection = GetCollection<T>();
var query = Query.EQ("_id", _id);
return collection.FindAs<T>(query).SingleOrDefault();
}
public List<T> GetAllObjects<T>() where T : MongoObject
{
var collection = GetCollection<T>();
return collection.FindAllAs<T>().ToList();
}
public List<T> QueryObject<T>(Expression<Func<T, bool>> exp) where T : MongoObject
{
var collection = GetCollection<T>();
var query = GetQuery(exp.Body);
return collection.FindAs<T>(query).ToList();
}
#region Helpers
private IMongoQuery GetQuery(Expression exp)
{
IMongoQuery query, leftQuery, rightQuery;
Expression left, right;
string property;
object value;
switch (exp.NodeType)
{
case ExpressionType.Equal:
left = (exp as BinaryExpression).Left;
right = (exp as BinaryExpression).Right;
property = (left as MemberExpression).Member.Name;
value = (right as ConstantExpression).Value;
query = Query.EQ(property, value.ToString());
break;
case ExpressionType.NotEqual:
left = (exp as BinaryExpression).Left;
right = (exp as BinaryExpression).Right;
property = (left as MemberExpression).Member.Name;
value = (right as ConstantExpression).Value;
query = Query.NE(property, value.ToString());
break;
case ExpressionType.AndAlso:
left = (exp as BinaryExpression).Left;
right = (exp as BinaryExpression).Right;
leftQuery = GetQuery(left);
rightQuery = GetQuery(right);
query = Query.And(leftQuery, rightQuery);
break;
case ExpressionType.OrElse:
left = (exp as BinaryExpression).Left;
right = (exp as BinaryExpression).Right;
leftQuery = GetQuery(left);
rightQuery = GetQuery(right);
query = Query.Or(leftQuery, rightQuery);
break;
case ExpressionType.GreaterThan:
left = (exp as BinaryExpression).Left;
right = (exp as BinaryExpression).Right;
property = (left as MemberExpression).Member.Name;
value = (right as ConstantExpression).Value;
query = Query.GT(property, value.ToString());
break;
case ExpressionType.GreaterThanOrEqual:
left = (exp as BinaryExpression).Left;
right = (exp as BinaryExpression).Right;
property = (left as MemberExpression).Member.Name;
value = (right as ConstantExpression).Value;
query = Query.GTE(property, value.ToString());
break;
case ExpressionType.LessThan:
left = (exp as BinaryExpression).Left;
right = (exp as BinaryExpression).Right;
property = (left as MemberExpression).Member.Name;
value = (right as ConstantExpression).Value;
query = Query.LT(property, value.ToString());
break;
case ExpressionType.LessThanOrEqual:
left = (exp as BinaryExpression).Left;
right = (exp as BinaryExpression).Right;
property = (left as MemberExpression).Member.Name;
value = (right as ConstantExpression).Value;
query = Query.LTE(property, value.ToString());
break;
default:
throw new Exception(exp.NodeType.ToString() + " not supported for now");
}
return query;
}
private MongoCollection GetCollection<T>() where T : MongoObject
{
return database.GetCollection((typeof(T)).Name);
}
#endregion
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment