MONGODB 数据的存储顺序发现不是按_ID 的顺序存储的原因

来源:互联网 发布:excel数据标签 编辑:程序博客网 时间:2024/06/02 22:35
在查询一个表的数据时发现查询返回的数据中_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" }
 
0 0