我正在使用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查询的一部分。
标题>