成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

MongoDB via C#

zacklee / 3374人閱讀

摘要:對(duì)于查詢的結(jié)果還可以進(jìn)行進(jìn)一步的操作。相當(dāng)于篩選條件,條件之間可是進(jìn)行組合。除了基本的,另外還有對(duì)于數(shù)組的等,對(duì)于時(shí)間有等。閑時(shí)更新如有錯(cuò)誤,多謝指正

安裝

首先需要安裝 MongoDB.Driver 包 nuget

首先的首先,需要安裝好 Mongo 數(shù)據(jù)庫(kù) 下載Mongo

配置好數(shù)據(jù)庫(kù),構(gòu)建好連接字符串就可以繼續(xù)使用了 連接字符串

! mongodb 默認(rèn)是沒(méi)有用戶名和密碼的,而且IP和端口都是開(kāi)放的,請(qǐng)自行做好安全防范的心里準(zhǔn)備

數(shù)據(jù) 數(shù)據(jù)層次 DataBase

對(duì)應(yīng) SQL的 Database

Collection

對(duì)應(yīng) SQL的 Table

Document

對(duì)應(yīng) SQL的 Row

文檔結(jié)構(gòu) BsonId

對(duì)于MongoDB中所有的Document都必須有一個(gè)_id字段。

在C#中對(duì)于這個(gè)"_id"字段可以使用一下的幾種操作:

ObjectId [Id|id|_id]

[ValueType|string] [Id|id|_id]

如果吝嗇使用Id這個(gè)屬性名(字段名)的話,也可使用 [BsonId] 這個(gè)特性手動(dòng)的指定映射的Id字段。
不論使用的是以上什么方法,在MongoDB中存儲(chǔ)的永遠(yuǎn)會(huì)是 _id 。
當(dāng)然,也可以不添加該字段,如果不想在查詢的時(shí)候報(bào)錯(cuò)的話,還是需要進(jìn)行一些額外的操作的。

對(duì)于ObjectId類型的_id,可是使用 ObjectId.GenerateNewId() 生成。

幾個(gè)常用的特性

[BsonId] : (prop) 指定_id字段

[BsonIgnore] : (prop) 在MongoDB中忽略,參考[JsonIgnore]

[BsonRequired] : (prop) 在MongoDB中強(qiáng)制要求

[BsonElement()] : (prop) 指定數(shù)據(jù)庫(kù)中的映射

[BsonExtraElements] : (prop) 該字段為擴(kuò)展字段

[BsonIgnoreExtraElements] : (class) 忽略額外的字段

大部分的特性對(duì)于插入的影響不大,對(duì)于查詢有較大的影響。其中忽略額外元素的特性可以進(jìn)行丟棄_id的操作。

操作

MongoDB 中增刪改都提供了One和Many兩組,同步和異步兩套,也就是4個(gè)操作。

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);

對(duì)于查詢的結(jié)果還可以進(jìn)行進(jìn)一步的操作。

_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 表達(dá)式,更改則需要使用 update definition .
所有的definition可以使用 Builders 進(jìn)行創(chuàng)建,也是自行實(shí)例化 DefinitionBuilder 然后構(gòu)建。以下默認(rèn)習(xí)慣性使用Builders進(jìn)行構(gòu)建。

Filter Definition

Filter Definition 相當(dāng)于篩選條件,條件之間可是進(jìn)行組合。

簡(jiǎn)單條件

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,點(diǎn)擊查看的Filter

Update Definition

Update Definition 是更新條目,相比Filter Definition,Update Definition 可是進(jìn)行鏈?zhǔn)讲僮?/p>

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

相對(duì)于SQL來(lái)說(shuō),MongoDB中提供的Update操作豐富多彩。除了基本的Set,另外還有對(duì)于數(shù)組的AddToSet、UnSet等,對(duì)于時(shí)間有CurrentDate等。點(diǎn)擊查看所有Update

Aggregate

MongoDB 中提供了聚合操作可是方便的對(duì)文檔集合進(jìn)行操作。其中常用的包括了 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中的表達(dá)式返回類型對(duì)應(yīng)的都需要是一個(gè)對(duì)象,在進(jìn)行映射的時(shí)候會(huì)轉(zhuǎn)換成BsonDocument,如果直接使用 Group(_=>_.Type,...)這樣的操作的話,會(huì)拋出 無(wú)法將 BsonValue 轉(zhuǎn)化為 BsonDocument 的錯(cuò)誤。

Tips

閑時(shí)更新

如有錯(cuò)誤,多謝指正

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/19125.html

相關(guān)文章

  • ES6 / TypeScript / Babel / C# 中的 super(base)

    摘要:今天看到寫(xiě)的中的和都錯(cuò)了,覺(jué)得很有意思,所以也研究了一下。但既然用,就是為了用它的靜態(tài)檢查,所以要充分關(guān)注編譯錯(cuò)誤提示。很遺憾,同樣的錯(cuò)誤。的正式名稱是,即那么,現(xiàn)在來(lái)說(shuō)說(shuō)的結(jié)果。因此在我實(shí)際工作中遇到類似問(wèn)題的概率非常低,不糾結(jié) 今天看到 @justjavac 寫(xiě)的《ES6 中的 this & super:babel 和 typescript 都錯(cuò)了》,覺(jué)得很有意思,所以也研究了一下...

    RaoMeng 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<