您的位置:首页 > 数据库 > Mongodb

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

2014-03-28 17:06 447 查看
在查询一个表的数据时发现查询返回的数据中_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" }
>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐