使_id索引在mongodb集合中是唯一的

时间:2017-01-26 10:03:11

标签: mongodb

我最近在Mongo 2.6 replicaset中看到了这个错误:

library(dplyr)
library(purrr)
map2(df1, df2, `<`) %>% 
       reduce(`&`) %>% 
       df1[.,]
#   v1 v2 v3 v4
#1  1  2 20  1
#3  3  5 23  1

我假设_id索引默认是唯一的。但我试图检查/设置它。 getIndexes显示没有唯一的选项集。

WARNING: the collection 'mydatabase.somecollection' lacks a unique index on _id. This index is needed for replication to function properly.

我试过> db.somecollection.getIndexes()[0] { "v" : 1, "key" : { "_id" : 1 }, "ns" : "mydatabase.somecollection", "name" : "_id_" } > db.somecollection.ensureIndex({"_id":1},{unique:true}) > { "numIndexesBefore" : 3, "note" : "all indexes already exist", "ok" : 1 } > db.somecollection.getIndexes()[0] { "v" : 1, "key" : { "_id" : 1 }, "ns" : "mydatabase.somecollection", "name" : "_id_" }

.validate(true)

以及运行无误的... "valid" : true, "errors" : [ ], "ok" : 1 } 。我无法删除_id索引来重新创建它 - 如何将索引设置为唯一或我应该怎样做才能确保RS中的数据一致性?请注意,RS已根据2.2 - >的升级说明进行了升级。 2.4 - &gt; 2.6。我找到了这个MongoDB - Collection lacks a unique index on _id,但没有什么可以解决我的问题。

2 个答案:

答案 0 :(得分:2)

过去,在副本集中添加了具有不同兼容性版本的新成员时,我已经看到了这一点。在副本集中的所有节点上运行db.adminCommand({getParameter:1,featureCompatibilityVersion:1}),如果不同,则停止该节点上的复制,更改CompatibilityVersion并准备将其复制到副本。

答案 1 :(得分:1)

事实证明,当一个新成员被添加到现有副本集时,错误就出现了,并且只显示在该成员上。如果我连接到数据库并尝试添加重复的_id,我会得到通常的E11000 duplicate key error index: ...,即使getIndexes()没有表明对索引的唯一约束(假设它是隐式的)。