1

私はこのようなC#コードを見つけました(CollectionタイプはMongoCollection<T>hereです):

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

さて、私が見つけた解決策の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 構文でも実行できますが、 return でWhereあるIEnumerableため、追加のキャストが必要です。

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