我有一個包含大約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