using System;
using System.Collections.Generic;
using System.Text;
using MongoDB.Driver;
using MongoDB.Bson;
using System.Configuration;
namespace DBUtility
{
/// <summary>
/// MongoDB 的数据库访问帮助类
/// </summary>
public abstract class MongoHelper
{
//数据库url 集合名称
private static readonly string MongoDatabaseUrl = ConfigurationManager.ConnectionStrings["MongoDbUrl"].ConnectionString;
private static readonly string MongoCollectionName = ConfigurationManager.AppSettings["CollectionName"];
/// <summary>
/// 查询
/// </summary>
/// <param name="url">MongoUrl的String表示,该Url必须包含数据库名称</param>
/// <param name="collection">集合名称</param>
/// <param name="query">查询条件,null表示查询所有</param>
/// <param name="fields">字段名称,null表示所有字段</param>
/// <param name="sortBy">排序字段,null表示不进行排序</param>
/// <returns>返回表示该查询结果的MongoCursor</returns>
public static MongoCursor<BsonDocument> Find(
string url,
string collection,
IMongoQuery query,
IMongoFields fields,
IMongoSortBy sortBy
)
{
return Find(url, collection, query, fields, sortBy, 0, 0);
}
/// <summary>
/// 查询,先排序,然后skip,接着limit
/// </summary>
/// <param name="url">MongoUrl的String表示,该Url必须包含数据库名称</param>
/// <param name="collection">集合名称</param>
/// <param name="query">查询条件,null表示查询所有</param>
/// <param name="fields">字段名称,null表示所有字段</param>
/// <param name="sortBy">排序字段,null表示不进行排序</param>
/// <param name="skip">跳过的Document数</param>
/// <param name="limit">返回的记录数,设置为 0 表示返回所有</param>
/// <returns>返回表示该查询结果的MongoCursor</returns>
public static MongoCursor<BsonDocument> Find(
string url,
string collection,
IMongoQuery query,
IMongoFields fields,
IMongoSortBy sortBy,
int skip,
int limit
)
{
MongoCursor<BsonDocument> retCursor = null;
MongoCollection coll = GetCollection(url, collection);
retCursor = coll.FindAs<BsonDocument>(query);
if (fields != null)
retCursor.SetFields(fields);
if (sortBy != null)
retCursor.SetSortOrder(sortBy);
retCursor.Skip = skip;
retCursor.Limit = limit;
return retCursor;
}
/// <summary>
/// 查询匹配查询结果的第一条记录
/// </summary>
/// <param name="url">MongoUrl的String表示,该Url必须包含数据库名称</param>
/// <param name="collection">集合名称</param>
/// <param name="query">查询条件,null表示查询所有</param>
/// <returns>返回表示该查询结果的BsonDocument</returns>
public static BsonDocument FindOne(
string url,
string collection,
IMongoQuery query)
{
MongoCollection c = GetCollection(url, collection);
return c.FindOneAs<BsonDocument>(query);
}
/// <summary>
/// 插入一个文档
/// </summary>
/// <param name="url">MongoUrl的String表示</param>
/// <param name="collection">集合名称</param>
/// <param name="data">一个表示文档的BsonDocument对象</param>
/// <returns>返回执行那个的SafeModeResult</returns>
public static SafeModeResult Insert(
string url,
string collection,
BsonDocument document
)
{
SafeModeResult smr = new SafeModeResult();
if (document != null)
return GetCollection(url, collection).Insert<BsonDocument>(document, SafeMode.True);
else
throw new ArgumentNullException("参数 document 不能为空");
}
/// <summary>
/// 更新多个匹配条件query的记录
/// </summary>
/// <param name="url">MongoUrl的String表示</param>
/// <param name="collection">集合名称</param>
/// <param name="query">查询条件,不能为null</param>
/// <param name="update">更新字段及数据,相当于 set fieldName=newValue,不能为null</param>
/// <returns>返回SafeModeResult</returns>
public static SafeModeResult Update(
string url,
string collection,
IMongoQuery query,
IMongoUpdate update
)
{
return MongoHelper.Update(url, collection, query, UpdateFlags.Multi, update);
}
/// <summary>
/// 更新匹配条件query的文档,需要设定更新方式
/// </summary>
/// <param name="url">MongoUrl的String表示</param>
/// <param name="collection">集合名称</param>
/// <param name="query">查询条件,不能为null</param>
/// <param name="update">更新字段及数据,相当于 set fieldName=newValue,不能为null</param>
/// <param name="flags">更新方式</param>
/// <returns>返回SafeModeResult</returns>
public static SafeModeResult Update(
string url,
string collection,
IMongoQuery query,
UpdateFlags flags,
IMongoUpdate update
)
{
if (query == null)
throw new ArgumentNullException("参数 query 不能为null");
if(update == null)
throw new ArgumentNullException("参数 update 不能为null");
MongoCollection c = GetCollection(url, collection);
return c.Update(query, update, flags, SafeMode.True);
}
/// <summary>
/// 删除所有匹配query的记录,如果query为null则删除所有记录
/// </summary>
/// <param name="url">MongoUrl的String表示</param>
/// <param name="collection">集合名称</param>
/// <param name="query">查询条件</param>
/// <returns>返回SafeModeResult</returns>
public static SafeModeResult Remove(
string url,
string collection,
IMongoQuery query)
{
return MongoHelper.Remove(url, collection, query, RemoveFlags.None);
}
/// <summary>
/// 删除第一条匹配query的记录,如果query为null则删除集合的第一条记录
/// </summary>
/// <param name="url">MongoUrl的String表示</param>
/// <param name="collection">集合名称</param>
/// <param name="query">查询条件</param>
/// <param name="flags">删除方式</param>
/// <returns>返回SafeModeResult</returns>
public static SafeModeResult Remove(
string url,
string collection,
IMongoQuery query,
RemoveFlags flags
)
{
MongoCollection c = GetCollection(url, collection);
return c.Remove(query, flags, SafeMode.True);
}
/// <summary>
/// 返回由url和collection指定的MongoCollection对象
/// </summary>
/// <param name="url">MongoUrl的String表示</param>
/// <param name="collection">集合名称</param>
/// <returns></returns>
private static MongoCollection GetCollection(
string url,
string collection)
{
MongoUrl u = new MongoUrl(url);
MongoServer s = MongoServer.Create(u);
MongoDatabase db = s.GetDatabase(u.DatabaseName);
MongoCollection c = db.GetCollection(collection);
return c;
}
}
}