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)

现在,第二个对我来说更具吸引力,因为它是我过去的样子,但就性能和最佳实践而言,有什么区别,推荐什么?

Mongodb最好的查询方式

您的第一个示例是使用驱动程序本机查询-本质上是通过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);
    ...
}

如果你重新定义了什么是"可用的小部件",你可以更新规范,让所有消费者的行为都一样。