簡體   English   中英

MongoDB驅動程序C#查詢優化

[英]MongoDb driver c# query optimization

我在mongo db doc中讀到,我也可以使用LINQ,但我對此一無所知。

例如,如果我寫:

var result = collection.Find(filter);

var result = collection.AsQueryable()
              .Where(x => x.Foo == 114)

什么是更好的?

LINQ篩選器基於整個集合嗎? 在獲得整個收藏之前,它會進行過濾嗎? 還是在過濾器之前,它給了我已經過濾的集合?

兩者幾乎一樣。

LINQ API是Collection API的包裝。

通過簡要研究mongo-csharp-driver的源代碼,我可以看到LINQ版本調用了Collection.FindAs(...)Collection.Distinct(...) 它基於LINQ表達式構造在query參數中傳遞的IMongoQuery 為此,它使用查詢構建器API( Query類),例如Query.EQ。

什么是更好的?

這取決於。

  • 如果您使用C#代碼中的類型表示數據庫中文檔的結構,則您可能會從LINQ API中受益。 您將受益於強大的鍵入功能,更好的可讀性,並且不會錯過使用名稱作為字符串傳遞的重命名標識符。
  • 如果您具有動態的數據結構,而代碼中沒有具體的表示形式(您具有某種有關文檔的元數據,但沒有明確包含文檔屬性的class )。 在這種情況下,使用LINQ會很麻煩,原始的Collection API將是一個更好的選擇。

LINQ篩選器基於整個集合嗎? 在獲得整個收藏之前,它會進行過濾嗎? 還是在過濾器之前,它給了我已經過濾的集合?

由於LINQ API實現了IQueryable而不是IEnumeable ,因此實際上並未調用所有可枚舉的方法(例如WhereOrderBy ),而是在編譯過程中將其轉換為生成表達式樹的代碼。 在運行時,將構建表達式樹並將其傳遞給基礎查詢提供程序(在這種情況下,由MongoDB驅動程序實現)。 查詢提供程序將表達式樹轉換為常規的MongoDB查詢,並通過常規的MongoDB API執行它們。

有關更多詳細信息,請參見如何:使用表達式樹構建動態查詢

因此,查詢實際上是在數據庫中執行的,並且只有已處理(過濾,排序或計划)的結果返回給應用程序。

但是,使用LINQ API會帶來一些性能開銷,因為LINQ API除了運行查詢之外,還:

  • 構建表達式樹以將其傳遞給查詢提供者
  • 訪問表達式樹以將其轉換為本地查詢

在許多情況下,這種開銷可以忽略不計,但這取決於您的要求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM