![](/img/trans.png)
[英]Is there a way to convert mongoDB json query to mongodb driver
[英]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.