安装
! mongodb 默认是没有用户名和密码的,而且IP和端口都是开放的,请自行做好安全防范的心里准备
数据
数据层次
DataBase
对应 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 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
Filter Definition
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 Definition
Update Definition 是更新条目,相比Filter Definition,Update Definition 可是进行链式操作
Builders.Update.Set(_=>_.title,title)
.Set(_=>_.desc,desc);
相对于SQL来说,MongoDB中提供的Update操作丰富多彩。除了基本的Set,另外还有对于数组的AddToSet、UnSet等,对于时间有CurrentDate等。点击查看所有Update
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
闲时更新
如有错误,多谢指正