我有一个包含大约600k文档的mongo集合。我正在枚举集合,按_id排序。但是,文档不以该排序顺序返回。它们似乎根据ObjectId的时间戳部分正确排序,但不是根据pid字段排序。有排序顺序的Mongo查询以错误的顺序返回文档
这是C#代码,我用它来摄制此:
var cursor = m_collection.FindAll().SetSortOrder(SortBy.Ascending("_id"));
ObjectId previous = ObjectId.Empty;
foreach (var document in cursor)
{
var id = document[IdField].AsObjectId;
Throw.Assert(id > previous, "Sort order is invalid!");
previous = id;
}
在某些时候,断言被触发。我可以看到新ID与前一个ID具有相同的时间戳,但是较低的PID。
我会期望使用{“_id”:1}排序使用ObjectIds的所有组件,而不仅仅是时间戳。
服务器是否使用与C#客户端的ObjectId.CompareTo不同的ObjectIds比较算法?
当您从MongoDB的壳牌查询的顺序一样吗?我只是想看看这是否是一个司机的问题。 – Majid 2013-04-04 18:57:16
订单与MongoDB Shell的订单相同。 – fparadis2 2013-04-05 12:22:01
我发现了这个问题。 C#驱动程序将ObjectId组件存储为带符号整数,并使用默认的带符号比较。服务器使用ObjectId的无符号表示进行排序。就我而言,我有时会遇到这样的情况:对于同一时间戳/机器,我有一个“正面”和一个“负面”(签名时)的pid。在这种情况下,有符号和无符号比较不会给出相同的结果。我认为这是C#驱动程序中的一个错误。 – fparadis2 2013-04-05 12:23:50