【问题标题】:in mongodb, what is the most efficient way to get the first and last document在mongodb中,获取第一个和最后一个文档的最有效方法是什么
【发布时间】:2019-06-29 23:35:06
【问题描述】:

我有这样的文件:

class A
{
    DateTime T;
    ...
}

我想找到最早和最新的文档。

这样做更好吗:

        var First   = db.Collection.AsQueryable().OrderBy(_ => _.t).FirstOrDefault();
        var Last    = db.Collection.AsQueryable().OrderByDescending(_ => _.t).FirstOrDefault();

或者,

        var First   = db.Collection.AsQueryable().OrderBy(_ => _.t).FirstOrDefault();
        var Last    = db.Collection.AsQueryable().OrderBy(_ => _.t).LastOrDefault();

        var C = db.Collection.AsQueryable().OrderBy(_ => _.t);
        var First = C.FirstOrDefault();
        var Last = C.LastOrDefault();

我想知道底层实现是否有任何东西会改变这些选项之间的速度?

我想知道排序是否已经完成一次,结果是否可能被缓存并且获取第一个和最后一个元素会更快?

【问题讨论】:

    标签: c# mongodb linq mongodb-.net-driver


    【解决方案1】:

    Profiler 在您不确定驱动程序语法时成为您的朋友。要为所有查询启用日志记录,您需要在数据库上运行以下语句:

    db.setProfilingLevel(2)
    

    然后检查您需要运行的数据库上执行的最后一个查询:

    db.system.profile.find().limit(1).sort( { ts : -1 } ).pretty()
    

    所以对于第一个代码 sn-p 你会得到:

    "pipeline" : [ { "$sort" : { "t" : 1 }  },
                   { "$limit" : 1 }
    ]
    
    "pipeline" : [ { "$sort" : { "t" : -1 }  },
                   { "$limit" : 1 }
    ]
    

    第二对打印出来

    "pipeline" : [ { "$sort" : { "t" : 1 }  },
                   { "$limit" : 1 }
    ]
    

    并在我的机器上为LastOrDefault 抛出 NotSupportedException,如果它适用于您的 MongoDB 驱动程序版本,您可以使用分析器检查生成的 MongoDB 语句

    当您在 Visual Studio 中将鼠标悬停在 c 上时,它会打印最后一个

    {aggregate([{ "$sort" : { "t" : 1 } }])}
    

    但由于它是IOrderedQueryable<T> 类型,它只是不是物化查询,因此当您运行FirstOrDefault 时它将在数据库上执行,生成与先前语句相同的聚合体。我也在这里得到 NotSupportedException。 Here 你可以找到支持的 LINQ 运算符列表,LastLastOrDefault 都没有实现,所以你需要降序排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多