簡體   English   中英

Mongodb查詢的最佳方法

[英]Mongodb best way to query

嗨,開始使用C#使用mongodb,發現它真的很酷,只是想知道查詢的最佳方法

似乎可以選擇以下選項

    var query = Query<Entity>.EQ(e => e.Id, id);
    var entity = collection.FindOne(query);

VS

    var entity = collection.Entity.AsQueryable().Single(x => x.Id == id)

現在,第二個對我來說更像是我慣用的,對我來說更具吸引力,但是就性能和最佳實踐而言,有什么區別和建議什么?

您的第一個示例是使用驅動程序本機查詢-本質上是通過Query<T>幫助器等創建QueryDocument

您的第二個是使用Linq。

在后台,這兩個都歸結為生成相同的查詢:

db.entity.find({_id: 'abc123'});

在這種情況下,結果QueryDocument被序列化為查詢

{_id: 'abc123'}

根據linq文檔

僅支持可以轉換為等效MongoDB查詢的LINQ查詢。 如果編寫的LINQ查詢無法翻譯,則會出現運行時異常,錯誤消息將指出不支持查詢的哪一部分。

對我來說,這暗示着將LINQ查詢轉換為MongoDB查詢會有一些開銷。

我還沒有測試過,但是我懷疑使用Query的性能更高

第一種方法是構建規范然后使用它來查找結果,實際上是規范模式

第二種方法是直接LINQ查詢,.NET開發人員通常更熟悉。

規范模式為您提供了可重用的過濾邏輯。 如果您經常需要按照相同的條件過濾集合,這將非常有用-特別是當需要將過濾器應用於來自各種存儲庫的集合時。

這是一個可能使用它的簡單示例(對任何粗糙的代碼,我已經離開C#已有一段時間了):

static class WidgetSpecification  {
    function Query<Widget> AvailableWidgets() 
    {
        return new Query<Widget>.EQ(e => 
          e.StartDate <= Date.Today 
          && e.EndDate >= Date.Today 
          && e.Active == true
          && e.InStock == true);
    }
}

然后,在應用程序中需要“可用小部件”的任何地方,您都將調用類似以下內容的代碼:

{
    ...
    var products = getProductsFromSomewhere();
    var query = WidgetSpecifiation.AvailableWidgets();

    var availableProducts = Products.Find(query);
    ...
}

如果您重新定義了“可用的小部件”,則可以更新規范並讓所有使用者表現相同。

暫無
暫無

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

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