Mongodb下_id key

Posted by 撒得一地 on 2016年3月21日 in Mongodb教程

MongoDb支持的数据库类型中,_id是其自有产物。下面简单介绍下_id key。

存储在MongoDB集合中的每个文档(document)都有一个默认的主键_id,这个主键名称是固定的,它可以是MongoDB支持的任何数据类型,默认是ObjectId。在关系数据库schema设计中,主键大多是数值型的,比如常用的int和long,并且更通常的是主键的取值由数据库自增获得,这种主键数值的有序性有时也表明了某种逻辑。反观MongoDB,它在设计之初就定位于分布式存储系统,所以它原生的不支持自增主键。

_id key举例说明:

当我们在往一个集合中写入一条文档时,系统会自动生成一个名为_id的key。如:

>db.person.insert({name:"psz",age:18})
WriteResult({"nInserted":1})
>db.person.find()
{ "_id" : ObjectId("4fb5faaf6d0f9d8ea3fc91a8"), "name" : "psz", "age" : 18 }

这里多出了一个类型为ObjectId的key,在插入时并没有指定,属于自动生成的。

在MongoDB中,每一个集合都必须有一个叫做_id的字段,字段类型默认是ObjectId,换句话说,字段类型可以不是ObjectId,例如:

>db.person.insert({_id:123,name:"psz2",age:19})
WriteResult({"nInserted":1})
>db.person.find()
{ "_id" : ObjectId("4fb5faaf6d0f9d8ea3fc91a8"), "name" : "psz", "age" : 18 }
{_"_id" : 123 , name : "psz2" , age : 19}

虽然_id的类型可以自由指定,但是在同一个集合中必须唯一,如果插入重复的值的话,系统将会抛出异常。如:

> db.person.insert({_id:1233, name:"psz3", age:19})
WriteResult({
    "nInserted":0,
    "WriteError":{
         "code":1000
         "errmsg":"E11000 duplicate key error index: test.person.$_id_ dup key: { : 123.0 }"

     }
})

因为之前已经插入一条_id=3的记录,所以再插入相同_id的文档就报错了。

总结

_id key可以用户分配,也可以由MongoDB自动分配,一般采用自动分配。

如果未使用_id作为分片key,则应用程序或客户端层要负责保证_id为唯一的,对于分配存在重复_id会有问题。

更新一个document 不会造成_ID被修改。

本文地址:http://coderschool.cn/1732.html,转载请注明。

上一篇:

下一篇:

相关推荐

网站地图|XML地图

Copyright © 2015-2024 技术拉近你我! All rights reserved.
闽ICP备15015576号-1 版权所有©psz.