Mongodb最好的查询方式
本文关键字:查询 方式 Mongodb | 更新日期: 2023-09-27 18:25:37
Hi开始使用带有c#的mongodb,发现它非常酷,只是想知道查询的最佳方式
似乎可以选择以下
var query = Query<Entity>.EQ(e => e.Id, id);
var entity = collection.FindOne(query);
与
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);
...
}
如果你重新定义了什么是"可用的小部件",你可以更新规范,让所有消费者的行为都一样。