摘要:对于查询的结果还可以进行进一步的操作。相当于筛选条件,条件之间可是进行组合。除了基本的,另外还有对于数组的等,对于时间有等。闲时更新如有错误,多谢指正
安装
首先需要安装 MongoDB.Driver 包 nuget
首先的首先,需要安装好 Mongo 数据库 下载Mongo
配置好数据库,构建好连接字符串就可以继续使用了 连接字符串
数据 数据层次 DataBase! mongodb 默认是没有用户名和密码的,而且IP和端口都是开放的,请自行做好安全防范的心里准备
对应 SQL的 Database
Collection对应 SQL的 Table
Document对应 SQL的 Row
文档结构 BsonId对于MongoDB中所有的Document都必须有一个_id字段。
在C#中对于这个"_id"字段可以使用一下的几种操作:
ObjectId [Id|id|_id]
[ValueType|string] [Id|id|_id]
如果吝啬使用Id这个属性名(字段名)的话,也可使用 [BsonId] 这个特性手动的指定映射的Id字段。
不论使用的是以上什么方法,在MongoDB中存储的永远会是 _id 。
当然,也可以不添加该字段,如果不想在查询的时候报错的话,还是需要进行一些额外的操作的。
对于ObjectId类型的_id,可是使用 ObjectId.GenerateNewId() 生成。
几个常用的特性[BsonId] : (prop) 指定_id字段
[BsonIgnore] : (prop) 在MongoDB中忽略,参考[JsonIgnore]
[BsonRequired] : (prop) 在MongoDB中强制要求
[BsonElement()] : (prop) 指定数据库中的映射
[BsonExtraElements] : (prop) 该字段为扩展字段
[BsonIgnoreExtraElements] : (class) 忽略额外的字段
大部分的特性对于插入的影响不大,对于查询有较大的影响。其中忽略额外元素的特性可以进行丢弃_id的操作。
操作MongoDB 中增删改都提供了One和Many两组,同步和异步两套,也就是4个操作。
Insert_collection.InsertOne(new Document(){}); _collection.InsertMany(new ListDelete(){}); _collection.InsertOneAsync(new Document(){}); _collection.InsertManyAsync(new List (){});
_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(_)) .AsCount() .ForEachAsync(func);
_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
Filter Definition 相当于筛选条件,条件之间可是进行组合。
简单条件
var filter = Builders.Filter.Eq(_=>_.userId,userId); _collection.Find(filter).ToList(); <=> _collection.Find(_=>_.userId == userId).ToList();
条件组合
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);
更多条件
Builders.Filter.Lt Builders .Filter.Lte Builders .Filter.Ne Builders .Filter.Gt Builders .Filter.Gte Builders .Filter.Not Builders .Filter.In Builders .Filter.Nin Builders .Filter.Exists Builders .Filter.Regex Builders .Filter.All Builders .Filter.Any Builders .Filter.Size Builders .Filter.SizeGt Builders .Filter.SizeGte Builders .Filter.SizeLt Builders .Filter.SizeLte Builders .Filter.OfType and more ...
以上只列举了部分的Filter,点击查看的Filter
Update DefinitionUpdate Definition 是更新条目,相比Filter Definition,Update Definition 可是进行链式操作
Builders.Update.Set(_=>_.title,title) .Set(_=>_.desc,desc);
相对于SQL来说,MongoDB中提供的Update操作丰富多彩。除了基本的Set,另外还有对于数组的AddToSet、UnSet等,对于时间有CurrentDate等。点击查看所有Update
AggregateMongoDB 中提供了聚合操作可是方便的对文档集合进行操作。其中常用的包括了 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闲时更新
如有错误,多谢指正
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/19125.html
摘要:今天看到写的中的和都错了,觉得很有意思,所以也研究了一下。但既然用,就是为了用它的静态检查,所以要充分关注编译错误提示。很遗憾,同样的错误。的正式名称是,即那么,现在来说说的结果。因此在我实际工作中遇到类似问题的概率非常低,不纠结 今天看到 @justjavac 写的《ES6 中的 this & super:babel 和 typescript 都错了》,觉得很有意思,所以也研究了一下...
阅读 2657·2021-10-22 09:55
阅读 1938·2021-09-27 13:35
阅读 1246·2021-08-24 10:02
阅读 1432·2019-08-30 15:55
阅读 1182·2019-08-30 14:13
阅读 3455·2019-08-30 13:57
阅读 1957·2019-08-30 11:07
阅读 2428·2019-08-29 17:12