C#驱动MongoDB的本质是将C#的操作代码转换为mongo shell,驱动的API也比较简单明了,方法名和js shell的方法名基本都保持一致,熟悉mongo shell后学习MongoDB的C#驱动是十分轻松的,直接看几个demo吧。

0.准备测试数据

使用js shell添加一些测试数据,如下:

use myDb
db.userinfos.insertMany([
{_id:, name: "张三", age: ,level:, ename: { firstname: "san", lastname: "zhang"}, roles: ["vip","gen" ]},
{_id:, name: "李四", age: ,level:, ename: { firstname: "si", lastname: "li"}, roles:[ "vip" ]},
{_id:, name: "王五", age: ,level:, ename: { firstname: "wu", lastname: "wang"}, roles: ["gen","vip" ]},
{_id:, name: "赵六", age: ,level:, ename: { firstname: "liu", lastname: "zhao"}, roles: ["gen"] },
{_id:, name: "田七", age: , ename: { firstname: "qi", lastname: "tian"}, address:'北京' },
{_id:, name: "周八", age: ,roles:["gen"], address:'上海' }
])

1 添加(InsertOne,InsertMany)

  安装nuget包(或者执行命令  Install-Package MongoDB.Driver)

然后就可以使用C#操作MongoDB数据库了,看一个添加的demo:

 class Program
{
static void Main(string[] args)
{
//连接数据库
var client = new MongoClient("mongodb://root:root@192.168.100.3:27017/");
//获取database
var mydb = client.GetDatabase("myDb");
//获取collection
var collection = mydb.GetCollection<BsonDocument>("userinfos");
//待添加的document
var doc = new BsonDocument{
{ "_id", },
{ "name", "吴九" },
{ "age", },
{ "ename", new BsonDocument
{
{ "firstname", "jiu" },
{ "lastname", "wu" }
}
}
};
//InsertOne()添加单条docment
collection.InsertOne(doc);
}
}

执行完成后,查看在NoSQLBooster中查询,看到已经添加成功了:

 

我们也可以是用 collection.InsertMany(IEnumerable<BsonDocument> docs) 来批量添加docment,这里就不再演示了。

2  查询(Find,Filter,Sort,Projection)

1.简单查询(Find、Filter)

查找name=“吴九"的记录

var client = new MongoClient("mongodb://root:root@192.168.100.3:27017/");
//获取database
var mydb = client.GetDatabase("myDb");
//获取collection
var collection = mydb.GetCollection<BsonDocument>("userinfos");
//Fileter用于过滤,如查询name = 吴九的第一条记录
var filter = Builders<BsonDocument>.Filter;
//Find(filter)进行查询
var doc = collection.Find(filter.Eq("name", "吴九")).FirstOrDefault();
Console.WriteLine(doc);

查询结果如下:

如果我们想查询所有的记录,可以设置过滤器为空,代码为: var docs = collection.Find(filter.Empty).ToList();

2.AND查询

查询年龄大于25且小于28的记录

//连接数据库
var client = new MongoClient("mongodb://root:root@192.168.100.3:27017/");
//获取database
var mydb = client.GetDatabase("myDb");
//获取collection
var collection = mydb.GetCollection<BsonDocument>("userinfos");
//查询25<age<28的记录
var filter = Builders<BsonDocument>.Filter;
var docs = collection.Find(filter.Gt("age", ) & filter.Lt("age", )).ToList();
docs.ForEach(d => Console.WriteLine(d));

查询结果如下:

3 OR查询

查询年龄小于25或年龄大于28的记录

var client = new MongoClient("mongodb://root:root@192.168.100.3:27017/");
//获取database
var mydb = client.GetDatabase("myDb");
//获取collection
var collection = mydb.GetCollection<BsonDocument>("userinfos");
//查询年龄小于25或年龄大于28的记录
var filter = Builders<BsonDocument>.Filter;
var docs = collection.Find(filter.Lt("age", ) | filter.Gt("age", )).ToList();
docs.ForEach(d => Console.WriteLine(d));

查询结果如下:

4 字段存在(Exists)

查询包含address字段的所有记录

//连接数据库
var client = new MongoClient("mongodb://root:root@192.168.100.3:27017/");
//获取database
var mydb = client.GetDatabase("myDb");
//获取collection
var collection = mydb.GetCollection<BsonDocument>("userinfos");
//查询存在address字段的记录
var filter = Builders<BsonDocument>.Filter;
var docs = collection.Find(filter.Exists("address")).ToList();
docs.ForEach(d => Console.WriteLine(d));

查询结果如下:

5 排序(Sort)

查询年龄小于26岁的记录,并按年龄倒序排列

//连接数据库
var client = new MongoClient("mongodb://root:root@192.168.100.3:27017/");
//获取database
var mydb = client.GetDatabase("myDb");
//获取collection
var collection = mydb.GetCollection<BsonDocument>("userinfos");
//查询age<26的记录,按年龄倒序排列
var filter = Builders<BsonDocument>.Filter;
var sort = Builders<BsonDocument>.Sort;
var docs = collection.Find(filter.Lt("age", ))//过滤
.Sort(sort.Descending("age")).ToList();//按age倒序
docs.ForEach(d => Console.WriteLine(d));

查询结果如下:

6 查询指定字段(Projection)

MongoDB查询会默认返回_id字段,如果要不返回_id字段可以使用Exclude("_id")将其排除。

//连接数据库
var client = new MongoClient("mongodb://root:root@192.168.100.3:27017/");
//获取database
var mydb = client.GetDatabase("myDb");
//获取collection
var collection = mydb.GetCollection<BsonDocument>("userinfos");
//查询age<26的记录 包含name age 排除 _id
var project = Builders<BsonDocument>.Projection;
var filter = Builders<BsonDocument>.Filter;
var docs = collection.Find(filter.Lt("age", ))//过滤
.Project(project.Include("name")//包含name
.Include("age")//包含age
.Exclude("_id")//不包含_id
).ToList();
docs.ForEach(d => Console.WriteLine(d));

查询结果:

3 修改(UpdateOne,UpdateMany)

1 修改单条记录(UpdateOne)

修改符合过滤条件的第一条记录,例子:将张三的年龄改成18岁

//连接数据库
var client = new MongoClient("mongodb://root:root@192.168.100.3:27017/");
//获取database
var mydb = client.GetDatabase("myDb");
//获取collection
var collection = mydb.GetCollection<BsonDocument>("userinfos");
var filter = Builders<BsonDocument>.Filter;
var update = Builders<BsonDocument>.Update;
var project = Builders<BsonDocument>.Projection;
//将张三的年龄改成18
collection.UpdateOne(filter.Eq("name", "张三"), update.Set("age", ));
//查询张三的记录
var doc = collection.Find(filter.Eq("name", "张三"))
.Project(project.Include("age").Include("name"))
.FirstOrDefault();
Console.WriteLine(doc);

执行结果:

2 修改多条记录(UpdateMany)

UpdateMany会修改所有符合过滤条件的记录,例子:将所有年龄小于25的记录标记为young(如果没有mark字段会自动添加)

//连接数据库
var client = new MongoClient("mongodb://root:root@192.168.100.3:27017/");
//获取database
var mydb = client.GetDatabase("myDb");
//获取collection
var collection = mydb.GetCollection<BsonDocument>("userinfos");
var filter = Builders<BsonDocument>.Filter;
var update = Builders<BsonDocument>.Update;
var project = Builders<BsonDocument>.Projection;
//将张三的年龄改成18
collection.UpdateOne(filter.Eq("name", "张三"), update.Set("age", ));
//查询张三的记录
var doc = collection.Find(filter.Eq("name", "张三"))
.Project(project.Include("age").Include("name"))
.FirstOrDefault();
Console.WriteLine(doc);

查询结果如下,可以看到age<25的记录的mark字段值为young:

4 删除(DeleteOne和DeleteMany)

删除操作比较简单,DeleteOne用于删除符合过滤条件的第一条记录,DeleteMany用于删除所有符合过滤条件的记录。

1 删除单条记录(DeleteOne)

 删除名字为张三的记录

//连接数据库
var client = new MongoClient("mongodb://root:root@192.168.100.3:27017/");
//获取database
var mydb = client.GetDatabase("myDb");
//获取collection
var collection = mydb.GetCollection<BsonDocument>("userinfos");
var filter = Builders<BsonDocument>.Filter;
var project = Builders<BsonDocument>.Projection;
//删除名字为张三的记录
collection.DeleteOne(filter.Eq("name", "张三"));
var docs = collection.Find(filter.Empty)
.Project(project.Include("age").Include("name").Include("mark"))
.ToList();
docs.ForEach(d => Console.WriteLine(d));

执行结果如下,我们看到张三的记录已经被删除了:

2  删除多条记录(DeleteMany)

删除所有年龄大于25岁的记录

//连接数据库
var client = new MongoClient("mongodb://root:root@192.168.100.3:27017/");
//获取database
var mydb = client.GetDatabase("myDb");
//获取collection
var collection = mydb.GetCollection<BsonDocument>("userinfos");
var filter = Builders<BsonDocument>.Filter;
var project = Builders<BsonDocument>.Projection;
//删除age>25的记录
DeleteResult result = collection.DeleteMany(filter.Gt("age", ));
Console.WriteLine($"一共删除了{result.DeletedCount}条记录");
var docs = collection.Find(filter.Empty)
.Project(project.Include("age").Include("name").Include("mark"))
.ToList();
docs.ForEach(d => Console.WriteLine(d));

执行结果如下,所有年龄大于25岁的记录都被删除了:

5 类型映射

1 简单例子

 有时候我们要让查询的结果映射到我们的实体类中去,实现这个需求也十分简单,mongoDB支持自动映射,直接使用泛型即可,看一个(清空数据db.userinfos.remove({}),从新初始化js脚本):

 class Program
{
static void Main(string[] args)
{
//连接数据库
var client = new MongoClient("mongodb://root:root@192.168.100.3:27017/");
//获取database
var mydb = client.GetDatabase("myDb");
//获取collection
var collection = mydb.GetCollection<Userinfo>("userinfos");
var filter = Builders<Userinfo>.Filter;
var sort = Builders<Userinfo>.Sort;
List<Userinfo> userinfos = collection.Find(filter.Lt("age", )) //查询年龄小于25岁的记录
.Sort(sort.Descending("age")) //按年龄进行倒序
.ToList();
//遍历结果
userinfos.ForEach(u => Console.WriteLine($"姓名:{u.name},年龄:{u.age},英文名:{u.ename.firstname} {u.ename.lastname}"));
Console.ReadKey();
} /// <summary>
/// 用户类
/// </summary>
public class Userinfo
{
public int _id { get; set; }//id
public string name { get; set; }//姓名
public int age { get; set; }//年龄
public int level { get; set; }//等级
public Ename ename { get; set; }//英文名
public string[] roles { get; set; }//角色
public string address { get; set; }//地址
} /// <summary>
/// 英文名
/// </summary>
public class Ename
{
public string firstname { get; set; }
public string lastname { get; set; }
}

执行结果如下:

2 常用属性  

上边的例子仅仅用了基本的自动化映射,使用基本的自动化映射时:类和Bson中的字段必须严格一致(_id除外,可以自动映射到_id/id/Id),且Bson中的每一个字段在实体类中都必须有一个对应的字段,不然就会抛出异常,这就造成我们可能要写一个非常庞大的实体类,而且类中的字段命名也要严格和Bson中的字段一致。这些限制对我们开发来说是不能接受的,这里我们采用mongoDriver中的一些属性改进一下上边的代码,如下:

 class Program
{
static void Main(string[] args)
{
//连接数据库
var client = new MongoClient("mongodb://root:root@192.168.100.3:27017/");
//获取database
var mydb = client.GetDatabase("myDb");
//获取collection
var collection = mydb.GetCollection<Userinfo>("userinfos"); var filter = Builders<Userinfo>.Filter;
var sort = Builders<Userinfo>.Sort;
List<Userinfo> userinfos = collection.Find(filter.Lt("age", )) //查询年龄小于25岁的记录
.Sort(sort.Descending("age")) //按年龄进行倒序
.ToList();
//遍历结果
userinfos.ForEach(u =>
{
Console.WriteLine($"编号:{u.userId},姓名:{u.name},年龄:{u.age},英文名:{u.ename?.ming} {u.ename?.xing},性别:{u.gender}");
Console.WriteLine($"其他属性:{u.otherprops}");
Console.WriteLine();
}); Console.ReadKey();
} /// <summary>
/// 用户类
/// </summary
//[BsonIgnoreExtraElements]
public class Userinfo
{
[BsonId]
public int userId { get; set; }//id
public string name { get; set; }//姓名
public int age { get; set; }//年龄
public Ename ename { get; set; }//英文名
[BsonDefaultValue('男')]
public char gender { get; set; }
[BsonIgnore]
public string nickname { get; set; }//昵称
[BsonExtraElements]
public BsonDocument otherprops { get; set; }//其他属性
}
/// <summary>
/// 英文名
/// </summary>
public class Ename
{
[BsonElement("firstname")]
public string ming { get; set; }
[BsonElement("lastname")]
public string xing { get; set; }
}

执行结果如下:

这里用到了几个常用的属性,作用如下:

  BsonId修饰的字段对应BsonDocument中的_id;

  BsonDefaultValue(value)用于指定默认值;

  BsonIgnore表示不映射,即使BsonDocument中包含该字段也不会赋值给属性;

  BsonExtraElements修饰的字段用于存储没有映射到类中的其他属性;

  BsonElement可以指定修饰的属性映射到BsonDocument中的哪个字段,

还有一些其他的属性,具体可以参考官方文档。

3 MongoDB使用Linq查询 

 MongoDB的驱动支持Linq查询,用法十分简单,引用  usingMongoDB.Driver.Linq;  后,使用  collection.AsQueryable()  获取IMongoQueryable<T>实例,然后就可以使用Linq对这个IMongoQueryable<T>进行查询了。

  使用过EF的小伙伴应该都了解IQueryable+Linq的查询默认不是将整个结果集立即加载到内存中,而是延迟加载的,即只有使用结果时(如 在执行First,Last,Single,Count,ToList等)才会将Linq转换成Sql,在数据库中执行查询操作。类似的,在使用IMongoQueryable<T>+Linq进行查询时默认也是延迟加载的,在需要使用查询结果时,驱动会将Linq转换成聚合管道命令(aggregation pipeline),如Linq中的Where被转换成$watch,Join转换为$lookup,Skip和Take转换为$skip和$limit等等,然后在Mongodb中执行这些管道命令获取结果,看一个栗子我们就会轻松地掌握了。

首先添加一些测试数据:

//添加学生数据
db.students.insertMany([
{"no":, "stuName":"jack", "age":, "classNo":},
{"no":, "stuName":"tom", "age":, "classNo":},
{"no":, "stuName":"hanmeimei", "age":, "classNo":},
{"no":, "stuName":"lilei", "age":, "classNo":}
]) //添加班级数据
db.classes.insertMany([
{"no" : ,"clsName" : "A班"},
{"no" : ,"clsName" : "B班"}
])

这里查找了两组数据:①基本查询:查找年龄大于22岁的学生;②连接查询:查询各个学生的学号、姓名、班级名。例子比较简单,直接看代码吧

namespace ConsoleAppCore
{
using System;
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
//连接数据库
var client = new MongoClient("mongodb://root:root@192.168.100.3:27017/");
//获取database
var mydb = client.GetDatabase("myDb");
//获取collection
var stuCollection = mydb.GetCollection<Student>("students");
var clsCollection = mydb.GetCollection<Classx>("classes");
//查找年龄大于22的学生
Console.WriteLine("-------------查找年龄大于22的学生列表--------------");
//1.query语法
List<Student> stuList1 = (from stu in stuCollection.AsQueryable()
where stu.age >
select stu).ToList();
//2.点语法
List<Student> stuList2 = stuCollection.AsQueryable().Where(s => s.age > ).ToList();
stuList1.ForEach(stu => Console.WriteLine($"姓名:{stu?.stuName}, 年龄:{stu?.age}"));
Console.WriteLine(); //表连接查询,查询各个学生的班级名
Console.WriteLine("-------------表连接,查询学生的班级名----------------");
//1.query语法
var result1 = from stu in stuCollection.AsQueryable()
join cls in clsCollection.AsQueryable()
on stu.classNo equals cls.no
select new { stuno = stu.no, stu.stuName, cls.clsName };
//2.点语法
var result2 = stuCollection.AsQueryable().Join(
clsCollection.AsQueryable(),
stu => stu.classNo,
cls => cls.no,
(stu, cls) => new { stuno = stu.no, stu.stuName, cls.clsName }
);
//遍历结果
foreach (var item in result1)
{
Console.WriteLine($"学号:{item.stuno}, 姓名:{item.stuName}, 班级:{item.clsName}");
} Console.ReadKey();
}
/// <summary>
/// 学生类
/// </summary
public class Student
{
public int no { get; set; }//学号
public string stuName { get; set; }//姓名
public int age { get; set; }//年龄
public int classNo { get; set; }//班级编号
[BsonExtraElements]
public BsonDocument others { get; set; }
}
/// <summary>
/// 班级类
/// </summary>
public class Classx
{
public int no { get; set; }//班级编号
public string clsName { get; set; }//班级名
[BsonExtraElements]
public BsonDocument others { get; set; }
}
}
}

执行结果如下:

.net Core MongoDB用法演示的更多相关文章

  1. 快速掌握mongoDB(四)—— C#驱动MongoDB用法演示

    前边我们已经使用mongo shell进行增删查改和聚合操作,这一篇简单介绍如何使用C#驱动MongoDB.C#驱动MongoDB的本质是将C#的操作代码转换为mongo shell,驱动的API也比 ...

  2. HTML5 Canvas阴影用法演示

    HTML5 Canvas阴影用法演示 HTML5 Canvas中提供了设置阴影的四个属性值分别为: context.shadowColor = “red” 表示设置阴影颜色为红色 context.sh ...

  3. C#中的yield return用法演示源码

    下边代码段是关于C#中的yield return用法演示的代码. using System;using System.Collections;using System.Collections.Gene ...

  4. Asp.Net Core MongoDB

    废话不说直接上代码: using MongoDB.Bson.Serialization.Attributes; namespace XL.Core.MongoDB { public interface ...

  5. ASP.NET Core+MongoDB(一)

    项目类库:.Net Standar 2.0web:ASP.NET CORE 2.2 版本 先上图,看我们的解决方案结构: 分别对上面的工程进行说明:1.KYSharpCore:为公共的基础类,最底层 ...

  6. MiniProfiler性能分析工具— .Net Core中用法

    前言: 在日常开发中,应用程序的性能是我们需要关注的一个重点问题.当然我们有很多工具来分析程序性能:如:Zipkin等:但这些过于复杂,需要单独搭建. MiniProfiler就是一款简单,但功能强大 ...

  7. .Net Core MongoDB 简单操作。

    一:MongoDB 简单操作类.这里引用了MongoDB.Driver. using MongoDB.Bson; using MongoDB.Driver; using System; using S ...

  8. MongoDB 用法入门(windows)①

    概述 大家对数据库肯定不陌生,肯定也有很多人用过MySQL,但是在用MySQL的时候各种建表,写表之间的关联让人非常头疼. MongoDB也是一种数据库,但是它不是用表,而是用集合来装数据的,我对这种 ...

  9. mongodb $用法,等

    1.$修改器 : $set 简单粗暴 {name:value} dict["name"]=value   $unset 简单粗暴的删除字段 {$unset:{name:1}} de ...

随机推荐

  1. JavaWeb Listener之HttpSessionBindListener

    HttpSessionBindListener        监听把自身这个对象绑定到HttpSession对象上.解绑 绑定到HttpSession对象上,其实就是调用session的setAttr ...

  2. Ambari 管理hadoop、hbase、zookeeper节点

    简介: Apache Ambari是一种基于Web的工具,支持Apache Hadoop集群的供应.管理和监控.Ambari已支持大多数Hadoop组件,包括HDFS.MapReduce.Hive.P ...

  3. Django rest framework ---- 权限

    Django rest framework ---- 权限 添加权限 api/utils文件夹下新建premission.py文件,代码如下: message是当没有权限时,提示的信息 # FileN ...

  4. django 基础进 COOKIE

    1 cookie session auth cookie概念:针对每一个服务器,保存在客户端浏览器的一个key-value结构数据,可以理解成一个字典结构 cookie语法:              ...

  5. MySol序

    1.mysql是基于C/S端的服务器软件 mysql服务端: server端开启,对文件的增删改查 , musql客户端::连接S端, 发送指令 isnert into t1 values(1); 2 ...

  6. nginx在linux下安装(源码编译)

    下载 http://nginx.org/en/download.html 安装 安装依赖 yum -y install gcc gcc-c++ zlib zlib-devel pcre-devel o ...

  7. csv与openpyxl函数

    csv 与openpyxl函数 csv函数 常用的存储数据的方式有两种--存储成csv格式文件.存储成Excel文件(不是复制黏贴的那种) 前面,我有讲到json是特殊的字符串.其实,csv也是一种字 ...

  8. ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于WIFI模块AT指令TCP透传方式,定时访问升级(含有数据校验)

    实现功能概要 定时使用http访问云端的程序版本,如果版本不一致,然后通过http下载最新的升级文件,实现升级. 测试准备工作(默认访问我的服务器,改为自己的服务器,请看后面说明) 一,下载BootL ...

  9. bzoj2287【POJ Challenge】消失之物 缺一01背包

    bzoj2287[POJ Challenge]消失之物 缺一01背包 链接 bzoj 思路 分治solve(l,r,arr)表示缺少物品\([l,r]\)的dp数组arr. 然后solve(l,mid ...

  10. haproxy 配置文件详解 之 综述

    HAProxy 配置文件根据功能和用途,主要有5 个部分组成,但有些部分并不是必须的,可以根据需要选择相应的部分进行配置. 1.global 部分 用来设定全局配置参数,属于进程级的配置,通常和操作系 ...