.NET MongoDB Driver 2.2使用示例
说明: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使用示例的更多相关文章
- c# MongoDB Driver 官方教程翻译
先贴官方文档地址:http://mongodb.github.io/mongo-csharp-driver/2.5/getting_started/quick_tour/ 安装部分很简单,nuget搜 ...
- C# mongoDB Driver 使用对象方式查询语法大全
#region 查询方法 /// <summary> /// 获取单个对象 /// </summary> /// <typeparam name="T" ...
- MongoDB Driver 简单的CURD
c#中我们可以使用MongoDB.Driver驱动进行对MongoDB数据库的增删改查. 首先需要在NuGet中安装驱动 安装完毕后会发现会有三个引用 其中 MongoDB.Driver和MongoD ...
- 基于MongoDB.Driver的扩展
由于MongoDB.Driver中的Find方法也支持表达式写法,结合[通用查询设计思想]这篇文章中的查询思想,个人基于MongoDB扩展了一些常用的方法. 首先我们从常用的查询开始,由于MongoD ...
- MongoDB系列:五、MongoDB Driver使用正确的姿势连接复制集
MongoDB复制集(Replica Set)通过存储多份数据副本来保证数据的高可靠,通过自动的主备切换机制来保证服务的高可用.但需要注意的时,连接副本集的姿势如果不对,服务高可用将不复存在. 使用复 ...
- php MongoDB driver 查询实例
//是否只查mx $mx_on_switch = I("post.mx_on_switch"); //mx模糊查询 $mx_vague_check = I("post.m ...
- MongoDB.Driver 2.4以上版本 在.NET中的基本操作
MongoDB.Driver是操作mongo数据库的驱动,最近2.0以下版本已经从GitHub和Nuget中移除了,也就是说.NET Framework4.0不再能从官方获取到MongoDB的驱动了, ...
- PHP7 - MongoDB Driver 使用心得
php7 只能使用Mongodb driver来驱动mongodb. 使用Mongodb Driver连接数据库 刚开始使用Mongodb Driver的时候我是拒绝的.查看官方文档只看到一排的类和不 ...
- MongoDB入门及 c# .netcore客户端MongoDB.Driver使用
MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系 ...
随机推荐
- myecplise自带的tomcat问题
今天做一个项目时候,发现myecplise自带的tomcat上面部署了是可以运行的,可是当部署到自己下载的tomcat时候,就报错,tomcat可以启动,项目无法启动,查了问题,发现是web,xml中 ...
- ElasticSearch 学习记录之ES如何操作Lucene段
近实时搜索 提交(Commiting)一个新的段到磁盘需要一个 fsync 来确保段被物理性地写入磁盘,这样在断电的时候就不会丢失数据.但是每次提交的一个新的段都fsync 这样操作代价过大.可以使用 ...
- 手机端rem如何适配_rem详解及使用方法2
作为一个前端开发人员,我们的任务是将UI设计师的图稿运用计算机语言呈现在用户面前.而现在的设备大小尺寸不一,近年来智能手机的普及更是让网页的用户大部分来源与手机,所以让不同大小的移动端屏幕都能较好的还 ...
- Paho -物联网 MQTT C Cient的实现和详解
概述 在文章Paho - MQTT C Cient的实现中,我介绍了如何使用Paho开源项目创建MQTTClient_pulish客户端.但只是简单的介绍了使用方法,而且客户端的结果与之前介绍的并 ...
- python2 与python3的变化
1 写文件如果是bytes类型的话,打开文件 open参数设置为wb 2 python2 默认包import是相对路径,python3是绝对路径 3 python3的dict没有has_key方法,用 ...
- 访问vm中centos的web站点
vm网络连接设置成NAT 需要把centos设置成静态IP 再不行,记得把centos的防火墙先关闭
- windows c++ 错误汇总
1.fatal error C1900 错误:fatal error C1900: “P1”(第“20081201”版)和“P2”(第“20080116”版)之间 Il 不匹配 检查之后发现jepgl ...
- python模块安装报错 :error: command 'gcc' failed with exit status 1
参考:http://blog.csdn.net/fenglifeng1987/article/details/38057193 解决方法 yum install gcc libffi-devel py ...
- TurnipBit口袋编程计算机:和孩子一起DIY许愿的流星
听说对着流星许愿,许的愿望都会实现,虽然不知道这个说法是不是真的,但是流星还是很好看的,为了能一直看到流星,今天就自己做一个流星保存下来,想什么时候看,就什么时候看. 首先需要想象一下流星是什么样子的 ...
- python并发编程之多进程
一同步与异步 同步执行:一个进程在执行任务时,另一个进程必须等待执行完毕,才能继续执行 异步执行:一个进程在执行任务时,另一个进程无需等待其执行完毕就可以执行,当有消息返回时,系统会提醒后者进行处理, ...