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" }
>
按整数数据进行排序,这里做一些说明:
在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" }
>
相关文章推荐
- 原因分析如下: 遇到这种情况,很有可能是把一个int型业务数据的 设置setText()或者类似的方法中, 这样Android系统就会主动去资源文件当中寻找, 但是它不是一个资源文件ID, 所
- 任何国家都无法限制数字货币。为什么呢? 要想明白这个问题需要具备一点区块链的基础知识: 区块链使用的大致技术包括以下几种: a.点对点网络设计 b.加密技术应用 c.分布式算法的实现 d.数据存储技术 e.拜占庭算法 f.权益证明POW,POS,DPOS 原因一: 点对点网络设计 其中点对点的P2P网络是bittorent ,由于是点对点的网络,没有中心化,因此在全球分布式的网
- Elasticsearch之重要核心概念(cluster(集群)、shards(分配)、replicas(索引副本)、recovery(据恢复或叫数据重新分布)、gateway(es索引的持久化存储方式)、discovery.zen(es的自动发现节点机制机制)、Transport(内部节点或集群与客户端的交互方式)、settings(修改索引库默认配置)和mappings)
- 基于完全二叉树木形成的二叉树顺序存储-数据结构(13)
- 为什么HashMap取出的数据顺序和存储时的顺序不一致,如何解决?
- [数据结构]四种数据存储结构---顺序存储 链接存储 索引存储 散列存储
- Asp.mvc(一)~使用MongoDB来存储数据
- 文件重命名功能--对循环里特定的某一项操作,可是发现id等属性都相同每次都只能改变第一个的原因及其解法
- 数据结构(严蔚敏)C语言实现---线性表的顺序存储
- 数据表存储多id字符串,灵活sql由行转列
- 存储过程获取最后插入到数据表里面的ID
- 数据结构之线性表--顺序存储
- [Unity3D]手机3D游戏开发:如何实现最高分的存储与显示(七)----使用Game ID避免数据重复输入
- MongoDB数据量大于2亿后遇到的问题 及原因分析
- 数据结构——栈的顺序存储
- 大数据时代的数据存储,非关系型数据库MongoDB(一)(转)
- Kaggle数据条目爬取存储到mongodb
- MS SQL server 2005中查询某张表从30-40条数据,但主键ID不是连续的
- 关系型数据库与mongodb 数据同步时主键ID的使用
- 数据结构课程设计-通讯录管理系统c++版(顺序表存储,折半查找,递增排序)