如何在MongoDB中设置主键?


78

我想将我的一个字段设置为主键。我正在使用MongoDB作为NoSQL。

Answers:


87

_id字段是为mongodb中的主键保留的,并且应为唯一值。如果您未对其进行任何设置_id,则会自动用“ MongoDB Id对象”填充它。但是您可以在该字段中输入任何唯一信息。

附加信息:http//www.mongodb.org/display/DOCS/BSON

希望能帮助到你。


76
例如,这确实how to set one of my fields as primary key无法解决问题:我希望user_email作为用户集合中的键,但是如何将该字段设置为键和唯一
Medet Tleukabiluly 2015年

3
这如何回答问题?
Lokesh Sanapalli

_id字段是默认索引,并且必须是唯一的。因此,将作为唯一约束的数据放入该字段。(docs.mongodb.com/master/indexes/#default-id-index
史蒂芬·斯科特

24

另一种方法是Indexes为您的收藏创建并确保它们是唯一的。

您可以在以下链接中找到更多信息

我实际上发现这非常简单且易于实现。


3
“对索引的唯一约束确保了一个文档中集合中的字段只能有一个值。对于分片集合,这些唯一索引不能强制唯一性,因为插入和索引操作对于每个分片都是本地的” – docs.mongodb.org/手册/教程/…
JohnC '16

16

在mongodb中,_id字段保留为主键。如果未在对象中定义Mongodb,则使用内部ObjectId值,并创建索引以确保性能。

但是您可以为_id设置自己的唯一值,Mongodb会使用它而不是为您创建一个。即使您想使用多个字段作为主键,也可以使用一个对象:

{ _id : { a : 1, b: 1} }

在创建这些ID时要特别注意,键的顺序(示例中的a和b)很重要,如果将它们互换,则将其视为另一个对象。


13

如果您像RDBMS那样思考,则无法创建主键。默认主键是_id。但是您可以创建唯一索引。例子如下。

db.members.createIndex( { "user_id": 1 }, { unique: true } )

db.members.insert({'user_id':1,'name':'nanhe'})

db.members.insert({'name':'kumar'})

db.members.find();

输出如下。

{“ _id”:ObjectId(“ 577f9cecd71d71fa1fb6f43a”),“ user_id”:1,1,“ name”:“ nanhe”}

{“ _id”:ObjectId(“ 577f9d02d71d71fa1fb6f43b”),“名称”:“ kumar”}

当您尝试插入相同的user_id时,mongodb会引发写入错误。

db.members.insert({'user_id':1,'name':'aarush'})

WriteResult({“ nInserted”:0,“ writeError”:{“ code”:11000,“ errmsg”:“ E11000重复键错误集合:student.members索引:user_id_1 dup键:{:1.0}”}})



6

实现此行为的一种方法是,_id根据您要视为主键的自定义字段,将值设置为(在MongoDB中为主键保留)字段。
即如果我想employee_id作为主键,那么在MongoDB中创建文档时;分配_id与相同的值employee_id


3

这是创建主键的语法

db。<collection> .createIndex(<键和索引类型说明>,{unique:true})

让我们假设我们的数据库有一个名为student的集合,而它的文档有一个名为student_id的键,我们需要将其作为主键。然后,该命令应如下所示。

db.student.createIndex({student_id:1},{unique:true})

您可以通过尝试将重复的值添加到学生集合中来检查是否将此student_id设置为主键。

倾向于此文档以获取更多信息 https://docs.mongodb.com/manual/core/index-unique/#create-a-unique-index


3

http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/

您也可以检查此链接并自动增加_id字段。


19
请注意,不鼓励仅链接的答案,因此,SO答案应该是搜索解决方案的终点(与引用的另一种中途停留相比,随着时间的流逝,它们往往会过时)。请考虑在此处添加独立的摘要,并保留该链接作为参考。
kleopatra

4
现在链接已断开,因此此答案无用
PeterM

2
不推荐使用,因为该页面现在重定向到:docs.mongodb.com/manual/crud,其中未提及“自动”或“增量”。
死于maus

2

如果您在Meteor上使用Mongo,则可以使用_ensureIndex

CollectionName._ensureIndex({field:1 }, {unique: true});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.