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



我正在使用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

有人能说明这是否是预期的行为吗?

从我所看到的,通过打开分析,不同的应该发送到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" : ""
}

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

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查询的一部分。

最新更新