0

例とまったく同じように、MongoDb 公式ドライバーを使用し、Distinct() 操作 (サポートされている Linq 操作) を発行しています。

MongoDb の出力で期待できるのは、 Distinct 操作が Mongo Distinct コレクション操作に変換されているという証拠ですが、これを裏付ける証拠はありません。私が見ているのは次のようなものです (50 個のドキュメントを含むコレクションの場合) - 明確な操作が実行されている兆候はありません:

query Test_5ipsb2hn.Collection query: { Processing: { $exists: false } } ntoreturn:0 ntoskip:0 nscanned:50 keyUpdates:0 locks(micros) r:419 nreturned:50 reslen:1193 0ms

これが予想される動作であるかどうかについて、誰かが光を当てることができますか?

4

1 に答える 1

1

私が見ることができることから、個別のプロファイリングを mongo に送信する必要があります。以下は、テスト DB に対する個別のクエリの 2 つのトレースです。

{
        "op" : "command",
        "ns" : "test.$cmd",
        "command" : {
                "distinct" : "testing",
                "key" : "Value"
        },
        "ntoreturn" : 1,
        "keyUpdates" : 0,
        "numYield" : 0,
        "lockStats" : {
                "timeLockedMicros" : {
                        "r" : NumberLong(49),
                        "w" : NumberLong(0)
                },
                "timeAcquiringMicros" : {
                        "r" : NumberLong(2),
                        "w" : NumberLong(1)
                }
        },
        "responseLength" : 209,
        "millis" : 0,
        "ts" : ISODate("2013-06-12T23:53:29.872Z"),
        "client" : "127.0.0.1",
        "allUsers" : [ ],
        "user" : ""
}
{
        "op" : "command",
        "ns" : "test.$cmd",
        "command" : {
                "distinct" : "testing",
                "key" : "Value",
                "query" : {

                }
        },
        "ntoreturn" : 1,
        "keyUpdates" : 0,
        "numYield" : 0,
        "lockStats" : {
                "timeLockedMicros" : {
                        "r" : NumberLong(113),
                        "w" : NumberLong(0)
                },
                "timeAcquiringMicros" : {
                        "r" : NumberLong(4),
                        "w" : NumberLong(3)
                }
        },
        "responseLength" : 209,
        "millis" : 0,
        "ts" : ISODate("2013-06-12T23:53:51.730Z"),
        "client" : "127.0.0.1",
        "allUsers" : [ ],
        "user" : ""
}

最初のクエリは、C# から linq プロバイダー経由で送信されます。

mongoAdapter.Collection<TestClass>().AsQueryable().Select(s => s.Value).Distinct().ToList();

2 つ目は、コマンド ラインで実行される個別です。

db.testing.distinct('Value')

両方のプロファイリング レコードは、コマンド セクション内に個別のものを示しています。唯一の違いは、2 番目のレコードにもクエリ演算子が表示されることですが、これは空であるため、実際の個別のクエリに影響を与えることはありません。

したがって、私の簡単な答えは、Linq の個別の操作は、シェルと同じクエリを実行する必要があると考えているということです。

アップデート

linq クエリを Mongo に渡すには、コレクションがクエリ可能になっていることを確認する必要があります。

したがって、クエリを更新する場合

collection.Find(query).AsQueryable().Select(x =>x.SequencingId) .Distinct();

collection.AsQueryable().Where({you query here}).Select(x =>x.SequencingId) .Distinct();

問題は、コレクションに対して Find を実行しているためです。レコードが mongo クエリの一部としてではなく Enumerable として返されたら、実際にはメモリ内で個別を実行しているためです。

于 2013-06-13T00:10:01.923 に答える