91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在.NET Core中使用MongoDB明細教程是怎樣的

發布時間:2021-09-29 09:39:27 來源:億速云 閱讀:121 作者:柒染 欄目:大數據

這篇文章將為大家詳細講解有關在.NET Core中使用MongoDB明細教程是怎樣的,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

現在讓我們來研究一下文檔排序,指定要跳過或限制返回的文檔數量,以及如何進行投影。

Limit

當我們查詢一個文檔時,我們有時不想返回所有符合過濾條件的文檔,而只返回其中的一部分。這就是limit 方法的具體應用。對于MongoDB,可以通過調用Find返回的IFindFluentlimit方法來限制文檔的數量。因此,如果我查詢數據庫中年齡小于40歲的學生,我會得到以下信息:

S/N: 1 	 Id: 582489339798f091295b9094, FirstName: Gregor, LastName: Felix
S/N: 2 Id: 582489339798f091295b9095, FirstName: Machiko, LastName: Elkberg
S/N: 3 Id: 582489339798f091295b9096, FirstName: Julie, LastName: Sandal
S/N: 4 Id: 583da304f03a84d4d4f4678d, FirstName: Peter, LastName: Cyborg
 

為了讓它把結果限制在最多兩個學生,我調用了Limit()方法,并傳遞值為2的參數:

int count = 1;
await collection.Find(x => x.Age < 40)
   .Limit(2)
   .ForEachAsync(
       student =>
       {
           Console.WriteLine($"S/N: {count} \t Id: {student.Id}, FirstName: {student.FirstName}, LastName: {student.LastName}");
           count++;
       });
 

然后得到以下輸出,它只返回兩個文檔:

S/N: 1, 	 Id: 582489339798f091295b9094, FirstName: Gregor, LastName: Felix
S/N: 2, Id: 582489339798f091295b9095, FirstName: Machiko, LastName: Elkberg
   

Skip

如果我們想告訴數據庫要跳過多少文檔,我們使用fluent接口中的skip方法。因此,它類似于我們之前使用的代碼,但是告訴數據庫返回年齡小于40的所有代碼,并跳過第一個。

int count = 1;
await collection.Find(x => x.Age < 40)
   .Skip(1)
   .ForEachAsync(
       student =>
       {
           Console.WriteLine($"S/N: {count} \t Id: {student.Id}, FirstName: {student.FirstName}, LastName: {student.LastName}");
           count++;
       });
 
S/N: 1, 	 Id: 582489339798f091295b9095, FirstName: Machiko, LastName: Elkberg
S/N: 2, Id: 582489339798f091295b9096, FirstName: Julie, LastName: Sandal
S/N: 3, Id: 583da304f03a84d4d4f4678d, FirstName: Peter, LastName: Cyborg
 

你會注意到Gregor Felix被跳過了。使用skipsort,我們可以將分頁添加到應用程序中。

假設我們要檢索集合中的每個學生,一個頁面上最多顯示兩個學生。我們可以通過如下過程實現:

  • 跟蹤當前頁面和要檢索的最大文檔數。

  • 確定總頁數。

  • 然后檢索文檔,同時相應地應用skiplimit

我們可以使用以下代碼來完成此操作,并將每個頁面的結果打印到控制臺:

var client = new MongoClient();

var db = client.GetDatabase("schoool");

var collection = db.GetCollection<Student>("students");

int currentPage = 1, pageSize = 2;

double totalDocuments = await collection.CountAsync(FilterDefinition<Student>.Empty);
var totalPages = Math.Ceiling(totalDocuments / pageSize);

for (int i = 1; i <= totalPages; i++)
{
   Console.WriteLine($"Page {currentPage}");
   Console.WriteLine();

   int count = 1;
   await collection.Find(FilterDefinition<Student>.Empty)
       .Skip((currentPage - 1) * pageSize)
       .Limit(pageSize)
       .ForEachAsync(
           student =>
           {
               Console.WriteLine($"S/N: {count}, \t Id: {student.Id}, FirstName: {student.FirstName}, LastName: {student.LastName}");
               count++;
           });

   Console.WriteLine();
   currentPage++;
}
 

我們在控制臺窗口中得到以下結果:

Page 1

S/N: 1, Id: 58469c732adc9f5370e50c9c, FirstName: Gregor, LastName: Felix
S/N: 2, Id: 58469c732adc9f5370e50c9d, FirstName: Machiko, LastName: Elkberg

Page 2

S/N: 1, Id: 58469c732adc9f5370e50c9e, FirstName: Julie, LastName: Sandal
S/N: 2, Id: 58469c732adc9f5370e50c9f, FirstName: Peter, LastName: Cyborg

Page 3

S/N: 1, Id: 58469c732adc9f5370e50ca0, FirstName: James, LastName: Cyborg
 

這樣,我們得到三個頁面,因為我們總共有五個記錄,每頁最多檢索兩個文檔。

 

Sort

fluent接口的Sort方法采用SortDefinition作為參數,它可以從stringBsonDocument隱式轉換,就像FilterDefinition一樣。因此,如果我們想使用字符串作為排序定義,按姓氏升序排序,那么它將是:

await collection.Find(FilterDefinition<Student>.Empty)
   .Skip((currentPage - 1) * pageSize)
   .Limit(pageSize)
   .Sort("{LastName: 1}")
   .ForEachAsync(
       student =>
       {
           Console.WriteLine($"S/N: {count}, \t Id: {student.Id}, FirstName: {student.FirstName}, LastName: {student.LastName}, Age: {student.Age}");
           count++;
       });
 

在字符串中,我們有{LastName:1},其中1告訴它升序排序,而-1告訴它按降序排序。如果我們使用前面更新的代碼運行應用程序,它會在第一頁返回James和Peter作為結果,如下所示:

Page 1

S/N: 1, Id: 58469c732adc9f5370e50ca0, FirstName: James, LastName: Cyborg, Age: 39
S/N: 2, Id: 58469c732adc9f5370e50c9f, FirstName: Peter, LastName: Cyborg, Age: 39

Page 2

S/N: 1, Id: 58469c732adc9f5370e50c9d, FirstName: Machiko, LastName: Elkberg, Age: 23
S/N: 2, Id: 58469c732adc9f5370e50c9c, FirstName: Gregor, LastName: Felix, Age: 23

Page 3

S/N: 1, Id: 58469c732adc9f5370e50c9e, FirstName: Julie, LastName: Sandal, Age: 25
 

如果我們希望使用BsonDocument將姓氏按降序排列,則這將是:

await collection.Find(FilterDefinition<Student>.Empty)
   .Skip((currentPage - 1) * pageSize)
   .Limit(pageSize)
   .Sort(new BsonDocument("LastName", -1))
   .ForEachAsync(
       student =>
       {
           Console.WriteLine($"S/N: {count}, \t Id: {student.Id}, FirstName: {student.FirstName}, LastName: {student.LastName}, Age: {student.Age}");
           count++;
       });
 

給出了與之前結果相反的結果:

Page 1

S/N: 1, Id: 58469c732adc9f5370e50c9e, FirstName: Julie, LastName: Sandal, Age: 25
S/N: 2, Id: 58469c732adc9f5370e50c9c, FirstName: Gregor, LastName: Felix, Age: 23

Page 2

S/N: 1, Id: 58469c732adc9f5370e50c9d, FirstName: Machiko, LastName: Elkberg, Age: 23
S/N: 2, Id: 58469c732adc9f5370e50ca0, FirstName: James, LastName: Cyborg, Age: 39

Page 3

S/N: 1, Id: 58469c732adc9f5370e50c9f, FirstName: Peter, LastName: Cyborg, Age: 39
 

我們也可以使用SortDefinitionBuilder。因此,我們可以使用構建器幫助方法更新代碼以創建一個排序定義,如下所示:

await collection.Find(FilterDefinition<Student>.Empty)
   .Skip((currentPage - 1) * pageSize)
   .Limit(pageSize)
   .Sort(Builders<Student>.Sort.Descending("LastName"))
   .ForEachAsync(
       student =>
       {
           Console.WriteLine($"S/N: {count}, \t Id: {student.Id}, FirstName: {student.FirstName}, LastName: {student.LastName}, Age: {student.Age}");
           count++;
       });
 

我們仍然可以得到相同的結果,我們還可以組合不同字段上的升序和降序列表:

await collection.Find(FilterDefinition<Student>.Empty)
   .Skip((currentPage - 1) * pageSize)
   .Limit(pageSize)
   .Sort(Builders<Student>.Sort.Descending("LastName").Ascending("FirstName"))
   .ForEachAsync(
       student =>
       {
           Console.WriteLine($"S/N: {count}, \t Id: {student.Id}, FirstName: {student.FirstName}, LastName: {student.LastName}, Age: {student.Age}");
           count++;
       });
 

或使用強類型對象時,使用表達式樹:

await collection.Find(FilterDefinition<Student>.Empty)
   .Skip((currentPage - 1) * pageSize)
   .Limit(pageSize)
   .Sort(Builders<Student>.Sort.Descending(x => x.LastName).Ascending(x => x.FirstName))
   .ForEachAsync(
       student =>
       {
           Console.WriteLine($"S/N: {count}, \t Id: {student.Id}, FirstName: {student.FirstName}, LastName: {student.LastName}, Age: {student.Age}");
           count++;
       });
 

我們還可以使用表達式樹來指定對SortBySortByDescendingThenByThenByDescendingFLUENT接口的方法。按照前面的示例,這將被定義為:

await collection.Find(FilterDefinition<Student>.Empty)
   .Skip((currentPage - 1) * pageSize)
   .Limit(pageSize)
   .SortByDescending(x => x.LastName)
   .ThenBy(x => x.Age)
   .ForEachAsync(
       student =>
       {
           Console.WriteLine($"S/N: {count}, \t Id: {student.Id}, FirstName: {student.FirstName}, LastName: {student.LastName}, Age: {student.Age}");
           count++;
       });
 

大多數情況下,我們將使用強類型對象,因為使用表達式樹構建查詢要容易得多。

 

Projection投影

我們也可以使用fluent接口的Project方法進行投影。我們指定一個類似于排序和過濾的投影。

使用表達式樹或投影定義會導致稍微不同的行為。不同之處之一是,在使用投影定義語法時,必須明確地告訴它排除_id字段,否則,它會將其作為結果集的一部分返回。讓我們更新代碼,只返回FirstName

await collection.Find(FilterDefinition<Student>.Empty)
   .Skip((currentPage - 1) * pageSize)
   .Limit(pageSize)
   .SortByDescending(x => x.LastName)
   .ThenBy(x => x.Age)
   .Project("{FirstName: 1}")
   .ForEachAsync(
       student =>
       {
           Debug.WriteLine($"S/N: {count}, \t Id: {student.Id}, FirstName: {student.FirstName}, LastName: {student.LastName}, Age: {student.Age}");
           count++;
       });
 

使用更新的代碼,我們的應用程序無法編譯。給我們帶來了另一個區別:通過投影定義,它隱式地將文檔類型從Student轉換為bsondocument,因此我們得到的是一個fluent對象,其結果將是一個BsonDocument(即使我們使用的是Student類型)。如果我們想和Student一起工作,我們必須指出我們仍然希望將類型保留為Student

.Project<Student>("{FirstName: 1}")
 

因此,通過將Student設置為方法的類型來更新我們的代碼,將得到以下輸出:

Page 1

S/N: 1, Id: 58469c732adc9f5370e50c9e, FirstName: Julie, LastName: , Age: 0
S/N: 2, Id: 58469c732adc9f5370e50c9c, FirstName: Gregor, LastName: , Age: 0

Page 2

S/N: 1, Id: 58469c732adc9f5370e50c9d, FirstName: Machiko, LastName: , Age: 0
S/N: 2, Id: 58469c732adc9f5370e50ca0, FirstName: James, LastName: , Age: 0

Page 3

S/N: 1, Id: 58469c732adc9f5370e50c9f, FirstName: Peter, LastName: , Age: 0
 

您可以看到,雖然我們只需要FirstName,但是FirstNameId被返回,而其他的則保持默認值。為了解決這個問題,我們顯式地告訴它排除Id字段,并對投影定義進行以下更新:

.Project<Student>("{FirstName: 1, _id: 0}")
 

然后運行它,我們只返回FirstName,而其他值保持默認值:

Page 1

S/N: 1, Id: 000000000000000000000000, FirstName: Julie, LastName: , Age: 0
S/N: 2, Id: 000000000000000000000000, FirstName: Gregor, LastName: , Age: 0

Page 2

S/N: 1, Id: 000000000000000000000000, FirstName: Machiko, LastName: , Age: 0
S/N: 2, Id: 000000000000000000000000, FirstName: James, LastName: , Age: 0

Page 3

S/N: 1, Id: 000000000000000000000000, FirstName: Peter, LastName: , Age: 0
 

我們也可以使用投影生成器。.Project<Student>(Builders<Student>.Projection.Include(x => x.FirstName).Exclude(x => x.Id))這與使用定義生成器進行排序和篩選類似。我們也可以使用表達式樹進行投影,然后將其投影到不同的結果。以下代碼將只返回first 和last name,并將其映射到匿名類型:

int count = 1;
await collection.Find(FilterDefinition<Student>.Empty)
   .Project(x => new {x.FirstName, x.LastName})
   .ForEachAsync(
       student =>
       {
           Console.WriteLine($"{count}. \t FirstName: {student.FirstName} - LastName {student.LastName}");
           count++;
       });

Console.WriteLine();
 
1. 	 FirstName: Gregor - LastName Felix
2. FirstName: Machiko - LastName Elkberg
3. FirstName: Julie - LastName Sandal
4. FirstName: Peter - LastName Cyborg
5. FirstName: James - LastName Cyborg
 

您可能已經注意到,我們并沒有顯式地指明要排除Id,而是與另一種方式不同,這是因為在強類型表達式樹中,它同意只返回您指定的那些字段,而排除其他字段。

關于在.NET Core中使用MongoDB明細教程是怎樣的就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

梅州市| 长阳| 津市市| 融水| 巴东县| 庆安县| 江城| 通城县| 津南区| 福泉市| 象山县| 白玉县| 肃南| 阳江市| 花莲市| 洪湖市| 宝鸡市| 鄂托克旗| 苍山县| 荥阳市| 舞钢市| 龙山县| 庆云县| 龙南县| 涟水县| 砀山县| 滦南县| 合作市| 彭山县| 湖口县| 盐城市| 日土县| 东阿县| 迁安市| 丰都县| 泗洪县| 博野县| 菏泽市| 比如县| 农安县| 仙桃市|