MongoDb官方驱动程序是否应该将Distinct()linq运算符转换为数据库操作?

时间:2013-06-12 20:31:59

标签: linq mongodb mongodb-.net-driver

我正在使用MongoDb官方驱动程序并发出Distinct()操作(supported Linq operation),完全按照示例。

我期望在MongoDb输出中看到的一些证据表明,Distinct操作正被转换为Mongo Distinct collection operation,但我认为没有证据支持这一点。我看到的是这样的(对于包含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

任何人都可以了解这是否是预期的行为?

1 个答案:

答案 0 :(得分:1)

从我所看到的,通过转向分析,应该发送给mongo。以下是针对测试数据库的不同查询的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" : ""
}

第一个查询是通过linq提供程序从C#发送的:

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

第二个是在命令行中执行的不同。

db.testing.distinct('Value')

两个性能分析记录在命令部分中显示不同。唯一的区别是第二个记录也显示了一个查询运算符,但由于这是空的,我不认为这会影响实际的不同查询。

所以我的简短回答是我相信Linq的不同操作应该执行与shell中相同的查询。

更新

要将linq查询传递给Mongo,您需要确保该集合可以查询。

因此,如果您从

更新查询
collection.Find(query).AsQueryable().Select(x =>x.SequencingId) .Distinct();

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

问题是因为您正在对集合执行Find,一旦将记录作为Enumerable返回给您而不是作为mongo查询的一部分,您实际上在内存中执行distinct。