说明:mongoDBService是对各种常用操作的封装

public class MongoDBService
{
#region 变量
/// <summary>
/// 缓存
/// </summary>
private static ConcurrentDictionary<string, Lazy<MongoClient>> m_mongoClientCache =
new ConcurrentDictionary<string, Lazy<MongoClient>>();
/// <summary>
/// 连接字符串
/// </summary>
private string m_connectionStr = string.Empty;
/// <summary>
/// 数据库名称
/// 支持运行时更改
/// </summary>
public string DatabaseName { get; set; }
/// <summary>
/// 设置GridFS参数
/// </summary>
public GridFSBucketOptions BucksOptions { get; set; }
#endregion /// <summary>
/// 初始化操作
/// </summary>
public MongoDBService(string connStr, string database)
{
m_connectionStr = connStr;
DatabaseName = database;
} /// <summary>
/// 获得Mongo客户端
/// </summary>
/// <param name="connStr">连接串</param>
/// <returns></returns>
private static MongoClient GetClient(string connStr)
{
if (string.IsNullOrWhiteSpace(connStr)) throw new ArgumentException("MongoDB Connection String is Empty"); return m_mongoClientCache.GetOrAdd(connStr,
new Lazy<MongoClient>(() =>
{
return new MongoClient(connStr);
})).Value;
}
/// <summary>
/// 插入操作
/// </summary>
/// <param name="collectionName">集合名</param>
/// <param name="t">插入的对象</param>
/// <returns>返回是否插入成功true or false</returns>
public bool Insert<T>(string collectionName, T t)
{
if (string.IsNullOrWhiteSpace(collectionName)) throw new ArgumentException("collectionName是null、空或由空白字符组成");
MongoClient client = GetClient(m_connectionStr);
var db = client.GetDatabase(DatabaseName);
var collection = db.GetCollection<T>(collectionName);
Task task = collection.InsertOneAsync(t);
task.Wait();
return !task.IsFaulted;
}     //其他操作
    ......
}

数据模型

   /// <summary>
/// 没有子文档的模型
/// </summary>
public class Model1
{
public string Field1A { set; get; }
public int Field1B { set; get; }
public double Field1C { set; get; }
public float Field1D { set; get; }
public List<string> Field1E { set; get; }
} /// <summary>
/// 含有子文档和_id字段
/// </summary>
public class Model2
{
public string Id { set; get; }
public string Field2A { set; get; }
public DateTime Field2B { set; get; } public List<Model1> Field2C { set; get; }
}

一、简单操作

1创建文档

//错误写法1.字符串未加引号
/*
*“System.FormatException”类型的未经处理的异常在 MongoDB.Bson.dll 中发生
* 其他信息: Invalid JSON number '1A'.
*/
string json1Error = @"{'Id': 1AAAA1}";
//改正
string json1Right = @"{'Id':'1AAAA1'}"; //错误写法2.集合中的引号嵌套
/*
* System.FormatException”类型的未经处理的异常在 MongoDB.Bson.dll 中发生
* 其他信息: JSON reader was expecting ':' but found '':''.
*/
string json2Error = @"{'Field2B': '[
{
'Field1E':'[]'
}
]'}";
//改正
string json2Right = @"{'Field2B': [
{
'Field1E':[]
}
]}"; //错误写法3 构造键值对时,“:”使用中文输入法
/*
* System.FormatException”类型的未经处理的异常在 MongoDB.Bson.dll 中发生
* 其他信息: Invalid JSON input ''.
*/
string json3Error = @"{'Id':'1AAAA1'}";
//改正
string json3Right = @"{'Id':'1AAAA1'}";
#endregion //将json转换为BsonDocument
string json = @"{ 'Id':'100000000001',
'Field2A':'100',
'Field2B':'20160913',
'Field2C':[
{
'Field1A':'在MongoDB中一条记录是一个文档',
'Field1B':1,
'FieldC':13.14,
'Field1D':'13.14F',
'Field1E':[]
}
]
}"; BsonDocument doc1 = BsonDocument.Parse(json3Right); //也可以这样创建
BsonDocument doc2 = new BsonDocument
{
{ "Id", "" },
{ "Field2A",""},
{ "Field2B",DateTime.Now},
{ "Field2C", new BsonArray
{
new BsonDocument("Field1A","MongoDB具有高性能,高可用性,高扩展性"),
new BsonDocument("Field1B",),
new BsonDocument("Field1C",0.618),
new BsonDocument("Field1D",0.618F),
new BsonDocument("Field1E",new BsonArray()),
}
}
};

2 插入文档

调用的主要方法IMongoCollection<TDocument>.InsertOneAsync

           Model2 model = new Model2
{
Id = Guid.NewGuid().ToString("N"),
Field2A = "",
Field2B = DateTime.Now.Date,
Field2C = new List<Model1>()
}; for (int i = ; i < ; i++)
{
Model1 model1 = new Model1
{
Field1A = "Welcome to the MongoDB",
Field1B = i,
Field1C = 3.1415926,
Field1D = 3.1415926F,
Field1E = new List<string>()
};
model.Field2C.Add(model1);
}
//插入一个collection
bool t = mongoDBService.Insert(collectionName, model);

结果:

3删除文档

调用主要方法IMongoCollection<TDocument>.DeleteMany

mongoDBService.Delete<Model2>(collectionName, m => m.Field2A.Equals(DateTime.Parse("2016-09-08")));

二、复杂操作

1插入子文档

调用主要方法IMongoCollection<TDocument>.UpdateMany

        Model1 model1 = new Model1
{
Field1A = "MongoDB是一种开源文档型数据库",
Field1B = ,
Field1C = 3.1415926,
Field1D = 3.1415926F,
Field1E = new List<string>()
}; Model2 model2 = new Model2
{
Id = new Guid().ToString("N"),
Field2A = "",
Field2B = DateTime.Now.Date,
Field2C = new List<Model1>()
};
       FilterDefinitionBuilder<Model2> filterBuilder = Builders<Model2>.Filter;
//过滤条件字段Field2A==2
FilterDefinition<Model2> filter = filterBuilder.Eq(doc => doc.Field2A, "");
SortDefinitionBuilder<Model1> sortBuilder = Builders<Model1>.Sort;
//按字段Field1A升序排列
SortDefinition<Model1> sort = sortBuilder.Ascending(pu => pu.Field1A);
//最新插入的在最前面,这是通过将PushEach方法的参数position设置为0实现的
UpdateDefinitionBuilder<Model2> updateBuilder = Builders<Model2>.Update;
UpdateDefinition<Model2> update = updateBuilder.PushEach(doc => doc.Field2C, new List<Model1> { model1 }, null, , sort);
UpdateResult updateResult = mongoDBService.DocumentUpdate(collectionName, filter, update);

执行结果:

2更新子文档

调用主要方法IMongoCollection<TDocument>.UpdateMany

        string commentContent = "通过Update修改了";
FilterDefinitionBuilder<Model2> filterBuilder = Builders<Model2>.Filter;
//找到父文档,过滤条件为Field2A=2并且Field2B=“2018-01-21T16:00:00.000Z”
FilterDefinition<Model2> filterFather = filterBuilder.Eq(doc => doc.Field2A, "")
& filterBuilder.Eq(doc => doc.Field2B, DateTime.Parse("2016/9/13 0:00:00"));
//找到子文档,过滤条件Field1B=1,条件作用与字段Field2C,他是个集合,用来存储子文档
FilterDefinition<Model2> childFilter = filterBuilder.ElemMatch(
listField => listField.Field2C, childfield => childfield.Field1B == );
//上述条件的并
FilterDefinition<Model2> filter = Builders<Model2>.Filter.And(new FilterDefinition<Model2>[] { filterFather, childFilter }); //使用XXXX.$.XXXX定位字段
var update = Builders<Model2>.Update.Set("Field2C.$.Field1A", commentContent); UpdateResult updateResult = mongoDBService.DocumentUpdate(collectionName, filter, update);

运行结果:

3 找到某一个子文档

调用主要方法IMongoCollection<TDocument>.Find,将调用结果转化为List<T>,然后取第一个元素。

       FilterDefinitionBuilder<Model2> filterBuilder = Builders<Model2>.Filter;
//找到父文档,过滤条件为Field2A=2并且Field2B=“2018-01-21T16:00:00.000Z”
FilterDefinition<Model2> filterFather = filterBuilder.Eq(doc => doc.Field2A, "")
& filterBuilder.Eq(doc => doc.Field2B, DateTime.Parse("2018-01-21T16:00:00.000Z")); //投影定义创建器:ProjectionDefinitionBuilder
//用ProjectionDefinition过滤子文档,投影器创建器作用于Field2C,他是一个集合,用来保存多个子文档;过滤条件为Field1C = 3.1415926
ProjectionDefinitionBuilder<Model2> projBuilder = Builders<Model2>.Projection;
ProjectionDefinition<Model2> proj = projBuilder.ElemMatch(listField => listField.Field2C, childfield => childfield.Field1C == 3.1415926); FindOptions options = new FindOptions() { AllowPartialResults = true };
Model2 info = mongoDBService.Single<Model2>(collectionName, filterFather, options, proj);

结果:

4 获得所有子文档

调用主要方法IMongoCollection<TDocument>.Find

        //投影定义创建器:ProjectionDefinitionBuilder
//用ProjectionDefinition过滤子文档
ProjectionDefinitionBuilder<Model2> projBuilder = Builders<Model2>.Projection;
ProjectionDefinition<Model2> proj = projBuilder.ElemMatch(listField => listField.Field2C, childfield => childfield.Field1B ==); List<Model2> info = mongoDBService.List<Model2>(collectionName,
m => m.Field2A == "" && m.Field2B == DateTime.Parse("2018-01-21T16:00:00.000Z"), proj);

5文档排序

调用主要方法IMongoCollection<TDocument>.Find

       SortDefinitionBuilder<Model2> sortBuilder = Builders<Model2>.Sort;
////按字段Field2A降序排列
SortDefinition<Model2> sort = sortBuilder.Descending(m => m.Field2A); List<Model2> info = mongoDBService.FindAllList(collectionName, sort);

6内嵌文档分页

调用主要方法IMongoCollection<TDocument>.Find

若匹配出多个文档,取第一个元素

       //投影定义创建器:ProjectionDefinitionBuilder
//用ProjectionDefinition过滤子文档
ProjectionDefinitionBuilder<Model2> projBuilder = Builders<Model2>.Projection;
//Include :确定要包含哪些字段值(即给哪些字段赋值)
//Slice:获得子文档集合分片,第一个参数field指取出的子文档集合,第二各参数skip指跳过多少个子文档,第三个参数limit取出多少个
ProjectionDefinition<Model2> proj = projBuilder.Include(m => m.Field2C).Slice(m => m.Field2C, , );
//过滤条件是Field2A=2
Model2 doc = mongoDBService.SubdocumentPageList<Model2>(collectionName, m => m.Field2A == "", proj);

7删除子文档

调用主要方法IMongoCollection<TDocument>.UpdateOne

       //过滤器作用与Field2C字段,过滤条件是Field1B = 1
var update = Builders<Model2>.Update.PullFilter(m => m.Field2C, (y => y.Field1B == ));
//父文档过滤条件为Field2A=2,如果匹配出多个父文档,只操作第一个文档
mongoDBService.UpdateOne<Model2>(collectionName, m => m.Field2A == "", update);

8聚集操作

调用主要方法IMongoCollection<TDocument>.Aggregate

1)筛选数据

        //unwind阶段
var unwind = new BsonDocument{
{
"$unwind","$Field2C"
}
};
//match阶段。匹配条件Field2A=2,Field1B=1
//注意Field2A为字符串类型,2用引号包起来;而Field1B为整形,所以1不能用引号包起来
var match = new BsonDocument
{
{
"$match",
new BsonDocument
{
{
"Field2A",""
}
,
{
"Field2C.Field1B",
}
}
}
};
//group阶段
var group = new BsonDocument
{
{
"$group",
new BsonDocument
{
{
"_id","$Field1C"
},
{
"Field2C",
new BsonDocument
{
{
"$push","$Field2C"
}
}
}
} }
};
var r = mongoDBService.Aggregate<Model2>(collectionName, new BsonDocument[] { unwind, match, group });       //也可以使用
      var r = mongoDBService.Aggregate(collectionName, unwind, match, group);

2)获得数组大小

      var match = new BsonDocument
{
{
"$match",new BsonDocument{{"Field2A",""}}
}
}; var project = new BsonDocument
{
{
"$project",new BsonDocument
{
{
"NumofArray",
new BsonDocument
{
{ "$size", "$Field2C" }
}
}
}
} };
BsonDocument bson = mongoDBService.Aggregate<BsonDocument>(collectionName,
new BsonDocument[] { match, project }).FirstOrDefault<BsonDocument>();
int count = bson != null?bson.GetValue("NumofArray").AsInt32:;

MongoDBService下载地址:https://files.cnblogs.com/files/hdwgxz/MongoDBService.rar

-----------------------------------------------------------------------------------------

转载与引用请注明出处。

时间仓促,水平有限,如有不当之处,欢迎指正。

.NET MongoDB Driver 2.2使用示例的更多相关文章

  1. c# MongoDB Driver 官方教程翻译

    先贴官方文档地址:http://mongodb.github.io/mongo-csharp-driver/2.5/getting_started/quick_tour/ 安装部分很简单,nuget搜 ...

  2. C# mongoDB Driver 使用对象方式查询语法大全

    #region 查询方法 /// <summary> /// 获取单个对象 /// </summary> /// <typeparam name="T" ...

  3. MongoDB Driver 简单的CURD

    c#中我们可以使用MongoDB.Driver驱动进行对MongoDB数据库的增删改查. 首先需要在NuGet中安装驱动 安装完毕后会发现会有三个引用 其中 MongoDB.Driver和MongoD ...

  4. 基于MongoDB.Driver的扩展

    由于MongoDB.Driver中的Find方法也支持表达式写法,结合[通用查询设计思想]这篇文章中的查询思想,个人基于MongoDB扩展了一些常用的方法. 首先我们从常用的查询开始,由于MongoD ...

  5. MongoDB系列:五、MongoDB Driver使用正确的姿势连接复制集

    MongoDB复制集(Replica Set)通过存储多份数据副本来保证数据的高可靠,通过自动的主备切换机制来保证服务的高可用.但需要注意的时,连接副本集的姿势如果不对,服务高可用将不复存在. 使用复 ...

  6. php MongoDB driver 查询实例

    //是否只查mx $mx_on_switch = I("post.mx_on_switch"); //mx模糊查询 $mx_vague_check = I("post.m ...

  7. MongoDB.Driver 2.4以上版本 在.NET中的基本操作

    MongoDB.Driver是操作mongo数据库的驱动,最近2.0以下版本已经从GitHub和Nuget中移除了,也就是说.NET Framework4.0不再能从官方获取到MongoDB的驱动了, ...

  8. PHP7 - MongoDB Driver 使用心得

    php7 只能使用Mongodb driver来驱动mongodb. 使用Mongodb Driver连接数据库 刚开始使用Mongodb Driver的时候我是拒绝的.查看官方文档只看到一排的类和不 ...

  9. MongoDB入门及 c# .netcore客户端MongoDB.Driver使用

    MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系 ...

随机推荐

  1. kendo ui grid选中行事件,获取combobox选择的值

    背景: 以前用 telerik ui做的grid现在又要换成kendo ui,不过说句实话kendo ui真的比telerik好多,可以说超级升级改头换面.当然用的mvc的辅助方法,以前的teleri ...

  2. bzoj 3142: [Hnoi2013]数列

    Description 小T最近在学着买股票,他得到内部消息:F公司的股票将会疯涨.股票每天的价格已知是正整数,并且由于客观上的原因,最多只能为N.在疯涨的K天中小T观察到:除第一天外每天的股价都比前 ...

  3. bat检测文件大小并邮件报警

    rem 获取当前日期 set TimeName=%date:~0,4%%date:~5,2%%date:~8,2% rem 获取文件名 set file=%TimeName%   rem 获取文件大小 ...

  4. 封装数据库配置文件App配置文件

    <connectionStrings>   <add name="strCon" connectionString="Data Source=.;Ini ...

  5. [经验分享]WebApi+SwaggerUI 完美展示接口

    不喜欢说废话,直接上干货. 第一步: 打开VS IDE ,新建一个WebAPI项目 选择Web .Net FrameWork (如果喜欢使用.Net Core的可以使用.Net Core) 选择Web ...

  6. > library('ggplot2') Error in loadNamespace(i, c(lib.loc, .libPaths()), versionCheck = vI[[i]]) : 不存在叫‘colorspace’这个名字的程辑包

    > library('ggplot2')Error in loadNamespace(i, c(lib.loc, .libPaths()), versionCheck = vI[[i]]) : ...

  7. c# 去除字符串中重复字符

    String.Join 和 Distinct 方法 https://www.cnblogs.com/louby/p/6224960.html 1.在写程序中经常操作字符串,需要去重,以前我的用方式利用 ...

  8. python编辑器pydev安装

    pydev实际上时eclipse的插件 1.安装eclipse(1)eclipse不需要安装,解压文件夹,点击eclipse.exe可使用 2.安装pydev (1) 解压pydev可看到featur ...

  9. angular4.0项目main.ts详解

    main.ts负责引导整个angular应用的起点 // 导入enableProdMode用来关闭angular开发者模式 import { enableProdMode } from '@angul ...

  10. iOS 动画篇 之 Core Animation (一)

    iOS中实现动画有两种方式,一种是自己不断的通过drawRect:方法来绘制,另外一种就是使用核心动画(Core Animation). 导语: 核心动画提供高帧速率和流畅的动画,而不会增加CPU的负 ...