MONGODB 数据的存储顺序发现不是按_ID 的顺序存储的原因
生活随笔
收集整理的這篇文章主要介紹了
MONGODB 数据的存储顺序发现不是按_ID 的顺序存储的原因
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在查詢一個表的數據時發現查詢返回的數據中_id 字段的值的排序是亂的。并沒有
按整數數據進行排序,這里做一些說明:
?
?
在MONGODB 中,如果沒有加sort,返回的是數據原始存儲的順序,和下面的代碼一致:
?
db.test.find().sort({$natural:1})
?
(原始存儲順序)
?
而指定排序順序如下:
db.test.find().sort({_id:1})
?
為什么會是亂的呢,
?
當你把字段的值update時,字段的長度在逐步增加.因為MongoDB在記錄長度變化后,發現當前記錄所在空間后面沒有空余的空間可供其變長。
那么這條記錄就會被刪除然后移動到數據集的最后,所以導致$natural最后排序的結果和之前不一樣。
? ? ? 下面我做一個測試: ? #1:在一個表中插入100條記錄 ? >?for(var?i=0;i<100;i++)db.test.insert({_id:i,a:'1'}) SingleWriteResult({ "writeErrors"?:?[?], "writeConcernErrors"?:?[?], "nInserted"?:?1, "nUpserted"?:?0, "nUpdated"?:?0, "nModified"?:?0, "nRemoved"?:?0, "upserted"?:?[?] }) >?db.test.count() 100 >?db.test.find() {?"_id"?:?0,?"a"?:?"1"?} {?"_id"?:?1,?"a"?:?"1"?} {?"_id"?:?2,?"a"?:?"1"?} {?"_id"?:?3,?"a"?:?"1"?} {?"_id"?:?4,?"a"?:?"1"?} {?"_id"?:?5,?"a"?:?"1"?} {?"_id"?:?6,?"a"?:?"1"?} {?"_id"?:?7,?"a"?:?"1"?} {?"_id"?:?8,?"a"?:?"1"?} {?"_id"?:?9,?"a"?:?"1"?} {?"_id"?:?10,?"a"?:?"1"?} {?"_id"?:?11,?"a"?:?"1"?} {?"_id"?:?12,?"a"?:?"1"?} {?"_id"?:?13,?"a"?:?"1"?} {?"_id"?:?14,?"a"?:?"1"?} {?"_id"?:?15,?"a"?:?"1"?} {?"_id"?:?16,?"a"?:?"1"?} {?"_id"?:?17,?"a"?:?"1"?} {?"_id"?:?18,?"a"?:?"1"?} {?"_id"?:?19,?"a"?:?"1"?} Type?"it"?for?more ? 用兩種方法查詢看看數據的第一條記錄: ? >?db.test.find().sort({_id:1}).limit(1) {?"_id"?:?0,?"a"?:?"1"?} >?db.test.find().sort({$natural:1}).limit(1) {?"_id"?:?0,?"a"?:?"1"?} ? 下面進行修改:把a字段的值加長: ? >?db.test.update({},{a:'12'}) SingleWriteResult({ "writeErrors"?:?[?], "writeConcernErrors"?:?[?], "nInserted"?:?0, "nUpserted"?:?0, "nUpdated"?:?1, "nModified"?:?1, "nRemoved"?:?0, "upserted"?:?[?] }) ? 還是一樣 ? >?db.test.find().sort({_id:1}).limit(1) {?"_id"?:?0,?"a"?:?"12"?} >?db.test.find().sort({$natural:1}).limit(1) {?"_id"?:?0,?"a"?:?"12"?} >?db.test.update({},{a:'123'}) SingleWriteResult({ "writeErrors"?:?[?], "writeConcernErrors"?:?[?], "nInserted"?:?0, "nUpserted"?:?0, "nUpdated"?:?1, "nModified"?:?1, "nRemoved"?:?0, "upserted"?:?[?] }) ? 再加長: ? >?db.test.find().sort({_id:1}).limit(1) {?"_id"?:?0,?"a"?:?"123"?} >?db.test.find().sort({$natural:1}).limit(1) {?"_id"?:?0,?"a"?:?"123"?} >?db.test.update({},{a:'1234567890'}) SingleWriteResult({ "writeErrors"?:?[?], "writeConcernErrors"?:?[?], "nInserted"?:?0, "nUpserted"?:?0, "nUpdated"?:?1, "nModified"?:?1, "nRemoved"?:?0, "upserted"?:?[?] }) ? 再加長 ? >?db.test.find().sort({_id:1}).limit(1) {?"_id"?:?0,?"a"?:?"1234567890"?} >?db.test.find().sort({$natural:1}).limit(1) {?"_id"?:?0,?"a"?:?"1234567890"?} >?db.test.find().sort({_id:1}).limit(10) {?"_id"?:?0,?"a"?:?"1234567890"?} {?"_id"?:?1,?"a"?:?"1"?} {?"_id"?:?2,?"a"?:?"1"?} {?"_id"?:?3,?"a"?:?"1"?} {?"_id"?:?4,?"a"?:?"1"?} {?"_id"?:?5,?"a"?:?"1"?} {?"_id"?:?6,?"a"?:?"1"?} {?"_id"?:?7,?"a"?:?"1"?} {?"_id"?:?8,?"a"?:?"1"?} {?"_id"?:?9,?"a"?:?"1"?} >?db.test.find().sort({$natural:1}).limit(10) {?"_id"?:?0,?"a"?:?"1234567890"?} {?"_id"?:?1,?"a"?:?"1"?} {?"_id"?:?2,?"a"?:?"1"?} {?"_id"?:?3,?"a"?:?"1"?} {?"_id"?:?4,?"a"?:?"1"?} {?"_id"?:?5,?"a"?:?"1"?} {?"_id"?:?6,?"a"?:?"1"?} {?"_id"?:?7,?"a"?:?"1"?} {?"_id"?:?8,?"a"?:?"1"?} {?"_id"?:?9,?"a"?:?"1"?} ? 經過幾次的測試:我加長到以下情況時, >?db.test.update({},{a:'123456789012345678901234567890'}) SingleWriteResult({ "writeErrors"?:?[?], "writeConcernErrors"?:?[?], "nInserted"?:?0, "nUpserted"?:?0, "nUpdated"?:?1, "nModified"?:?1, "nRemoved"?:?0, "upserted"?:?[?] }) ? 下面看到結果了:可以看到原先的第一條記錄,_id:0 存儲順序已發生了變化,已不是第一條記錄了。 ? >?db.test.find().sort({_id:1}).limit(10) {?"_id"?:?0,?"a"?:?"123456789012345678901234567890"?} {?"_id"?:?1,?"a"?:?"1"?} {?"_id"?:?2,?"a"?:?"1"?} {?"_id"?:?3,?"a"?:?"1"?} {?"_id"?:?4,?"a"?:?"1"?} {?"_id"?:?5,?"a"?:?"1"?} {?"_id"?:?6,?"a"?:?"1"?} {?"_id"?:?7,?"a"?:?"1"?} {?"_id"?:?8,?"a"?:?"1"?} {?"_id"?:?9,?"a"?:?"1"?} ? >?db.test.find().sort({$natural:1}).limit(10) {?"_id"?:?1,?"a"?:?"1"?} {?"_id"?:?2,?"a"?:?"1"?} {?"_id"?:?3,?"a"?:?"1"?} {?"_id"?:?4,?"a"?:?"1"?} {?"_id"?:?5,?"a"?:?"1"?} {?"_id"?:?6,?"a"?:?"1"?} {?"_id"?:?7,?"a"?:?"1"?} {?"_id"?:?8,?"a"?:?"1"?} {?"_id"?:?9,?"a"?:?"1"?} {?"_id"?:?10,?"a"?:?"1"?} ? >?db.test.find().limit(10) {?"_id"?:?1,?"a"?:?"1"?} {?"_id"?:?2,?"a"?:?"1"?} {?"_id"?:?3,?"a"?:?"1"?} {?"_id"?:?4,?"a"?:?"1"?} {?"_id"?:?5,?"a"?:?"1"?} {?"_id"?:?6,?"a"?:?"1"?} {?"_id"?:?7,?"a"?:?"1"?} {?"_id"?:?8,?"a"?:?"1"?} {?"_id"?:?9,?"a"?:?"1"?} {?"_id"?:?10,?"a"?:?"1"?} >?db.test.find().sort({_id:1}).limit(10) {?"_id"?:?0,?"a"?:?"123456789012345678901234567890"?} {?"_id"?:?1,?"a"?:?"1"?} {?"_id"?:?2,?"a"?:?"1"?} {?"_id"?:?3,?"a"?:?"1"?} {?"_id"?:?4,?"a"?:?"1"?} {?"_id"?:?5,?"a"?:?"1"?} {?"_id"?:?6,?"a"?:?"1"?} {?"_id"?:?7,?"a"?:?"1"?} {?"_id"?:?8,?"a"?:?"1"?} {?"_id"?:?9,?"a"?:?"1"?} >? ?總結
以上是生活随笔為你收集整理的MONGODB 数据的存储顺序发现不是按_ID 的顺序存储的原因的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mongodb与mysql命令对比 (前
- 下一篇: NOSQL 之 cassadra 安装与