1

我找到了这样的 c# 代码(Collection是这里的类型MongoCollection<T>):

Collection.AsQueryable()
   .OrderByDescending(i => i.SomeField)
   .Where(i => i.OtherField == "bla-bla")

不像我预期的那样在服务器上同时运行排序(OrderBy)和过滤(Where),而是使用MongoDb引擎调用排序,并且所有进一步的过滤都在客户端处理,这需要相当多的时间。作为代码执行的结果,我在 Mongodb 分析器中发现的内容:

"query" : {
    "$query" : { },
    "$orderby" : {
       "SomeField" : -1
    }
 }

注释$query为空。好吧,关于如何使它在数据库上工作(排序和过滤)有什么想法吗?

4

2 回答 2

1

好吧,我刚刚找到的解决方案之一可能如下所示:

Collection.Find(
  Query.And(Query.EQ("OtherField", "bla-bla")).
  SetSortOrder(SortBy.Descending("SomeField").ToList()

它完全符合我的需要:

"query" : {
    "$query" : {
       "OtherField" : "bla-bla"
     },
    "$orderby" : {
       "SomeField" : -1
     }
 }

但是我不太喜欢这种方法,因为它让我对数据库字段名称进行硬编码。据推测,新的 c# 驱动程序 1.6 将允许您使用委托(如i => i.OtherField == "bla-bla".

还有其他方法吗?

于 2012-08-23T21:57:17.700 回答
1

要订购物品,必须检索所有物品,因此如果您将其指定为第一个操作,我希望您观察到的行为。所以你必须颠倒你的陈述(就像你在IMongoQuery语法中所做的那样)。这也可以在 LINQ 语法中完成,但由于Where返回IEnumerable,你需要一个额外的演员:

Collection.AsQueryable()
   .Where(i => i.OtherField == "bla-bla").AsQueryable()
   .OrderByDescending(i => i.SomeField)
于 2012-09-08T20:37:33.193 回答