所以我对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的单独集合???这似乎违背了嵌入式文档的想法。
答案 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统一性,现在存在一个在数据库级别内置的约束,而不是在应用程序级别实现。