0

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

谁能阐明这是否是预期的行为?

4

1 回答 1

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 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。

于 2013-06-13T00:10:01.923 回答