我正在使用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
任何人都可以了解这是否是预期的行为?
答案 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。