mongoDB:重复值的唯一索引

时间:2011-04-12 10:03:13

标签: mongodb nosql

所以我对mongoDb很新,所以我认为这可能是对一般用法的误解。所以忍受我。 我有一个我正在使用的文档架构

  { 
    name: "bob", 
    email: "bob@gmail.com", 
    logins: [ 
      { u: 'a', p: 'b', public_id: '123' }, 
      { u: 'x', p: 'y', public_id: 'abc' }
    ] 
  }

我的问题是我需要确保公共ID在文档和集合中是唯一的, 此外,有些现有记录是从没有记录的mySQL DB迁移的,因此将全部替换为mongo中的null值。

我认为它是一个索引

db.users.ensureIndex({logins.public_id: 1}, {unique: true});

由于缺少密钥而无效,并且正在抛出E11000 duplicate key error index:

或者这是一个更基本的架构问题,因为我不应该在这样的数组结构中嵌套对象。在哪种情况下,什么? user_logins的单独集合???这似乎违背了嵌入式文档的想法。

3 个答案:

答案 0 :(得分:2)

如果您希望 u p 在每个插入上始终具有相同的值(如示例代码段中所示),则可能需要使用{{1}插入运算符以确保public_id字段的唯一性。否则,我认为在整个系列中使用它们是非常困难的,而不是使用外部维护或js功能。

如果没有,我可能会将它们存储在自己的集合中,并使用public_id作为_id字段来确保它们在集合中的跨文档唯一性。也许这与doc数据库中嵌入式文档的想法相矛盾,但根据不同的要求,我认为这可以忽略不计。

答案 1 :(得分:1)

  

此外,有些现有记录是从没有记录的mySQL DB迁移出来的,因此将全部替换为mongo中的空值。

因此,您希望对不是真正唯一的数据集应用唯一索引。我认为这只是一个建模问题。

如果logins.public_id null会违反您的唯一性约束,那么就根本不要写它:

  { 
    logins: [ 
      { u: 'a', p: 'b' }, 
      { u: 'x', p: 'y' }
    ] 
  }

答案 2 :(得分:0)

谢谢大家。 最后,我选择将其分为2个集合,一个用于用户,一个用于登录。 用户看起来有点像..

   userDocument = {
      ...
      logins: [
        DBRef('loginsCollection', loginDocument._id), 
        DBRef('loginsCollection', loginDocument2._id),       
      ]
    }

   loginDocument = {
       ...
       user: new DBRef('userCollection', userDocument ._id)
    }

虽然不是我最初的目标(单个集合)但它正在工作,并且通过利用MongoId统一性,现在存在一个在数据库级别内置的约束,而不是在应用程序级别实现。