博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MongoDB via C#
阅读量:6211 次
发布时间:2019-06-21

本文共 5232 字,大约阅读时间需要 17 分钟。

安装

  1. 首先需要安装 MongoDB.Driver 包
  2. 首先的首先,需要安装好 Mongo 数据库
  3. 配置好数据库,构建好连接字符串就可以继续使用了

! mongodb 默认是没有用户名和密码的,而且IP和端口都是开放的,请自行做好安全防范的心里准备

数据

数据层次

DataBase

对应 SQL的 Database

Collection

对应 SQL的 Table

Document

对应 SQL的 Row

文档结构

BsonId

对于MongoDB中所有的Document都必须有一个_id字段。

在C#中对于这个"_id"字段可以使用一下的几种操作:

  1. ObjectId [Id|id|_id]
  2. [ValueType|string] [Id|id|_id]

如果吝啬使用Id这个属性名(字段名)的话,也可使用 [BsonId] 这个特性手动的指定映射的Id字段。

不论使用的是以上什么方法,在MongoDB中存储的永远会是 _id 。
当然,也可以不添加该字段,如果不想在查询的时候报错的话,还是需要进行一些额外的操作的。

对于ObjectId类型的_id,可是使用 ObjectId.GenerateNewId() 生成。

几个常用的特性

  1. [BsonId] : (prop) 指定_id字段
  2. [BsonIgnore] : (prop) 在MongoDB中忽略,参考[JsonIgnore]
  3. [BsonRequired] : (prop) 在MongoDB中强制要求
  4. [BsonElement()] : (prop) 指定数据库中的映射
  5. [BsonExtraElements] : (prop) 该字段为扩展字段
  6. [BsonIgnoreExtraElements] : (class) 忽略额外的字段

大部分的特性对于插入的影响不大,对于查询有较大的影响。其中忽略额外元素的特性可以进行丢弃_id的操作。

操作

MongoDB 中增删改都提供了One和Many两组,同步和异步两套,也就是4个操作。

Insert

_collection.InsertOne(new Document(){});_collection.InsertMany(new List
(){});_collection.InsertOneAsync(new Document(){});_collection.InsertManyAsync(new List
(){});

Delete

_collection.DeleteOne(_=>_.id == id);_collection.DeleteMany(_=>_.userid == userid);_collection.DeleteOneAsync(_=>_.id == id);_collection.DeleteManyAsync(_=>_.userid == userid);

Update

_collection.UpdateOne(_=>_.id == id,updateDefinition)_collection.UpdateMany(_=>_.userid = userid,updateDefinition)_collection.UpdateOneAsync(_=>_.id == id,updateDefinition)_collection.UpdateManyAsync(_=>_.userid = userid,updateDefinition)

Query

_collection.Find(_=>_.id == id).First();_collection.Find(_=>_.id == id).FirstOrDefault();_collection.Find(_=>_.userid == userid).ToList();_collection.Find(_=>_.id == id).FirstAsync();_collection.Find(_=>_.id == id).FirstOrDefaultAsync();_collection.Find(_=>_.userid == userid).ToListAsync();await _collection.FindAsync(_=>_.userid == userid);

对于查询的结果还可以进行进一步的操作。

_collection.Find(filter)            .SortBy(_=>_.CreateTime)            .Skip(skip)            .Limit(limt)            .Project(_=>new ProjectDocument(_))            .As
() .ForEachAsync(func);

Count

_collection.Count(_=>_.userId == userid).Count();_collection.Count(_=>_.userId == userid).CountAsync();

Query One And

_collection.FindOneAndDelete(_=>_.id == id);_collection.FindOneAndReplace(_=>_.id == id, new Document());_collection.FindOneAndUpdate(_=>_.id == id ,updateDefinition);_collection.FindOneAndDeleteAsync(_=>_.id == id);_collection.FindOneAndReplaceAsync(_=>_.id == id, new Document());_collection.FindOneAndUpdateAsync(_=>_.id == id ,updateDefinition);

Definition

以上所有的操作中查找可以使用 filter definition 也可以使用 lambda 表达式,更改则需要使用 update definition .

所有的definition可以使用 Builders<T> 进行创建,也是自行实例化 DefinitionBuilder<T> 然后构建。以下默认习惯性使用Builders<T>进行构建。

Filter Definition

Filter Definition 相当于筛选条件,条件之间可是进行组合。

  1. 简单条件

    var filter = Builders
    .Filter.Eq(_=>_.userId,userId);_collection.Find(filter).ToList();<=>_collection.Find(_=>_.userId == userId).ToList();
  2. 条件组合

    var filter = Builders
    .Filter.Eq(_=>_.userId,userId) &Builders
    .Filter.Eq(_=>_.title,title);var filter1 = Builders
    .Filter.Eq(_=>_.userId,userId) | Builders
    .Filter.Eq(_=>_.title,title);var filter2 = !filter;<=>var filter = Builders
    .Filter.And( Builders
    .Filter.Eq(_=>_.UserId,userid), Builders
    .Filter.Eq(_=>_.Title,title) );var filter1 = Builders
    .Filter.Or( Builders
    .Filter.Eq(_=>_.UserId,userid), Builders
    .Filter.Eq(_=>_.Title,title) );var filter2 = Builders
    .Filter.Not(filter);
  3. 更多条件

    Builders
    .Filter.LtBuilders
    .Filter.LteBuilders
    .Filter.NeBuilders
    .Filter.GtBuilders
    .Filter.GteBuilders
    .Filter.NotBuilders
    .Filter.InBuilders
    .Filter.NinBuilders
    .Filter.ExistsBuilders
    .Filter.RegexBuilders
    .Filter.AllBuilders
    .Filter.AnyBuilders
    .Filter.SizeBuilders
    .Filter.SizeGtBuilders
    .Filter.SizeGteBuilders
    .Filter.SizeLtBuilders
    .Filter.SizeLteBuilders
    .Filter.OfTypeand more ...

    以上只列举了部分的Filter,点击

Update Definition

Update Definition 是更新条目,相比Filter Definition,Update Definition 可是进行链式操作

Builders
.Update.Set(_=>_.title,title) .Set(_=>_.desc,desc);

相对于SQL来说,MongoDB中提供的Update操作丰富多彩。除了基本的Set,另外还有对于数组的AddToSet、UnSet等,对于时间有CurrentDate等。点击

Aggregate

MongoDB 中提供了聚合操作可是方便的对文档集合进行操作。其中常用的包括了 Group,Match,Project;

_collection.Aggregate().Match(_ => _.UserId==userid)                       .Group(_ => new {                            _.Type                        }, g => new                        {                            Type = g.Key,                            Count = g.Count()                        })                       .Project(_ => new                        {                            UserId = userid,                            Type = _.Type,                            Count = _.Count                        })                       .ToList();

需要注意的是,Group和Project中的表达式返回类型对应的都需要是一个对象,在进行映射的时候会转换成BsonDocument,如果直接使用 Group(_=>_.Type,...)这样的操作的话,会抛出 无法将 BsonValue 转化为 BsonDocument 的错误。

Tips

闲时更新

如有错误,多谢指正

转载地址:http://xadja.baihongyu.com/

你可能感兴趣的文章
运维跟开发一定有仇么?
查看>>
xcode symbol(s) not found for architecture i386错误解决方法
查看>>
从趣味游戏到排序算法(3)
查看>>
一个字符串小题目
查看>>
SharePoint Server中的用户信息管理
查看>>
SCOM 2012系列②安装部署SCOM
查看>>
WebAPi的可视化输出模式(RabbitMQ、消息补偿相关)所有webapi似乎都缺失的一个功能...
查看>>
ASP.NET MVC4+BootStrap 实战(四)
查看>>
构建基于Hibernate的servlet(1)
查看>>
[IE技巧] IE的 "已终止操作" (Operation Aborted) 之谜
查看>>
综合应用WPF/WCF/WF/LINQ之四:创建一个StateMachineWorkflow
查看>>
负载均衡连载之五
查看>>
iOS应用开发之CoreData[转]
查看>>
分享文件一个上传工具类
查看>>
覆盖索引或列包含
查看>>
总结了一些常见的排序算法,面试必备啊!
查看>>
【问题&解决】SQL2008 SQL Server身份认证方式登录失败(错误18456)解决方法图解...
查看>>
SQL Server 数据库设计规范
查看>>
090923 T 一个对象一对多关联的问题
查看>>
在Heroku上部署Node.js
查看>>