! mongodb 默认是没有用户名和密码的,并且IP和端口都是开放的,请自行作好安全防范的内心准备html
对应 SQL的 Databasegit
对应 SQL的 Tablegithub
对应 SQL的 Rowmongodb
对于MongoDB中全部的Document都必须有一个_id
字段。数据库
在C#中对于这个"_id"字段可使用一下的几种操做:api
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个操做。ui
_collection.InsertOne(new Document(){}); _collection.InsertMany(new List<Document>(){}); _collection.InsertOneAsync(new Document(){}); _collection.InsertManyAsync(new List<Document>(){});
_collection.DeleteOne(_=>_.id == id); _collection.DeleteMany(_=>_.userid == userid); _collection.DeleteOneAsync(_=>_.id == id); _collection.DeleteManyAsync(_=>_.userid == userid);
_collection.UpdateOne(_=>_.id == id,updateDefinition) _collection.UpdateMany(_=>_.userid = userid,updateDefinition) _collection.UpdateOneAsync(_=>_.id == id,updateDefinition) _collection.UpdateManyAsync(_=>_.userid = userid,updateDefinition)
_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<Document>() .ForEachAsync(func);
_collection.Count(_=>_.userId == userid).Count(); _collection.Count(_=>_.userId == userid).CountAsync();
_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);
以上全部的操做中查找
可使用 filter definition 也可使用 lambda 表达式,更改则须要使用 update definition .
全部的definition可使用 Builders<T> 进行建立,也是自行实例化 DefinitionBuilder<T> 而后构建。如下默认习惯性使用Builders<T>进行构建。
Filter Definition 至关于筛选条件,条件之间但是进行组合。
简单条件
var filter = Builders<Document>.Filter.Eq(_=>_.userId,userId); _collection.Find(filter).ToList(); <=> _collection.Find(_=>_.userId == userId).ToList();
条件组合
var filter = Builders<Document>.Filter.Eq(_=>_.userId,userId) &Builders<Document>.Filter.Eq(_=>_.title,title); var filter1 = Builders<Document>.Filter.Eq(_=>_.userId,userId) | Builders<Document>.Filter.Eq(_=>_.title,title); var filter2 = !filter; <=> var filter = Builders<Document>.Filter.And( Builders<Document>.Filter.Eq(_=>_.UserId,userid), Builders<Document>.Filter.Eq(_=>_.Title,title) ); var filter1 = Builders<Document>.Filter.Or( Builders<Document>.Filter.Eq(_=>_.UserId,userid), Builders<Document>.Filter.Eq(_=>_.Title,title) ); var filter2 = Builders<Document>.Filter.Not(filter);
更多条件
Builders<Document>.Filter.Lt Builders<Document>.Filter.Lte Builders<Document>.Filter.Ne Builders<Document>.Filter.Gt Builders<Document>.Filter.Gte Builders<Document>.Filter.Not Builders<Document>.Filter.In Builders<Document>.Filter.Nin Builders<Document>.Filter.Exists Builders<Document>.Filter.Regex Builders<Document>.Filter.All Builders<Document>.Filter.Any Builders<Document>.Filter.Size Builders<Document>.Filter.SizeGt Builders<Document>.Filter.SizeGte Builders<Document>.Filter.SizeLt Builders<Document>.Filter.SizeLte Builders<Document>.Filter.OfType and more ...
以上只列举了部分的Filter,点击查看的Filter
Update Definition 是更新条目,相比Filter Definition,Update Definition 但是进行链式操做
Builders<Document>.Update.Set(_=>_.title,title) .Set(_=>_.desc,desc);
相对于SQL来讲,MongoDB中提供的Update操做丰富多彩。除了基本的Set,另外还有对于数组的AddToSet、UnSet等,对于时间有CurrentDate等。点击查看全部Update
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 的错误。
闲时更新
若有错误,多谢指正