从我可以看到通过打开不同的分析应该发送到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 distinct 操作应该执行与在 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。