2012-01-10 82 views
3

我有一部分简单代码,由于唯一的索引约束而必须失败。但是这两个对象都被添加到数据库中,并且可以被查询,尽管索引是唯一的。MongoDB唯一索引不起作用

BasicDBObject typeUrlIndex = new BasicDBObject(); 
    typeUrlIndex.put(FIELD_TYPE_URL, 1); 

    BasicDBObject typeUrlIndexOptions = new BasicDBObject(); 
    typeUrlIndexOptions.put("background", true); 
    typeUrlIndexOptions.put("sparse", true); 
    typeUrlIndexOptions.put("unique", true); 
    typeUrlIndexOptions.put("dropDups", true); 

    objects.ensureIndex(typeUrlIndex, typeUrlIndexOptions); 

    // here I can check, that index is really created, and it is true. 
    List<DBObject> indexes = objects.getIndexInfo(); 

    BasicDBObject dbo1 = new BasicDBObject(FIELD_TYPE_URL, "aaa"); 
    objects.save(dbo1); 

    BasicDBObject dbo2 = new BasicDBObject(FIELD_TYPE_URL, "aaa"); 
    objects.save(dbo2); 

两个对象都保存并获得不同的_id。

Upd。 我发现,什么是错的。两个对象在保存到数据库后都会获得自己的ID,但实际上第二个对象不会被保存(即使通过给定的ID也不能查询)。

感谢araqnid,这给了正确的答案。不幸的是,我没有足够的评分来投票。

+1

嗯,即使你不能投票,你应该能够将答案标记为已接受,这将标记问题为已回答。 – araqnid 2012-01-10 18:20:26

+0

安东,您应该能够将此标记标记为悬停在您对答案进行投票的区域下方,然后单击您在此处看到的复选标记。 – IanWhalen 2012-01-16 19:54:21

回答

7

当两个物体显示出来,当你在一个新的会话看?如果保存是不安全的,即使服务器实际上会拒绝第二个,他们也可能会返回上面代码中分配的ID。

+0

是的,你是对的! – 2012-01-10 17:54:55

0

您需要添加{ unique: true }选项创建索引

mongodb unique index documentation

+0

我已经添加了这个选项,看看代码:typeUrlIndexOptions.put(“unique”,true); – 2012-01-10 16:33:03