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
- MONGODB 数据的存储顺序发现不是按_ID 的顺序存储的原因
- 数据存储的字节顺序
- 一般情况下的数据存储顺序
- CUDAArray的数据存储顺序
- 栈的顺序存储
- 栈的顺序存储
- 栈的顺序存储
- 队列的顺序存储
- 栈的顺序存储
- 串的顺序存储
- 串的顺序存储
- 顺序存储的栈
- 顺序存储的合并
- 队列的顺序存储
- 数组的顺序存储
- 队列的顺序存储
- 栈的顺序存储
- 队列的顺序存储
- CodeForces 404E Maze 1D
- RS232、RS422、RS485、TTL电平
- c++11学习笔记之智能指针
- 实参数组和形参数组在存储空间上完全重合
- 使用LruCache的代码整理
- MONGODB 数据的存储顺序发现不是按_ID 的顺序存储的原因
- perl的列表与数组(转)
- SQL2008 行锁使用RowLock
- 【jquery】jquery插件的开发
- 合并 CentOS 6.5 的两个 DVD 作为本地 YUM 源
- http权威指南读书笔记
- HDU 3033 I love sneakers! (变形分组背包)
- 武汉JAVA/android培训最优选择--传智播客武汉分校!
- deep learning reading list