我正在试图弄清楚如何最好地使用MongoDB来处理一个非常小而简单的用例,但是发现文档有些令人困惑。 我的文档应该代表用户可以收到许多电子邮件的事实。如果我遵循the documentation,最明显和最简单的解决方案是使用嵌入。问题是当我想验证电子邮件地址的唯一性时,嵌入时AFAIK是不可能的(当然我可以使用map / reduce,但它似乎是一个非常糟糕的选择)。
我绝对觉得电子邮件不值得拥有自己的收藏,但显然嵌入式对象不允许我进行验证(如果确实如此,我真的不相信它会有效)。 在这种情况下,您将如何设计架构?
答案 0 :(得分:2)
您可以使用{unique:true}设置在电子邮件子字段中定义索引。这将防止电子邮件地址的多个副本存储在集合中。
例如,假设您的文档看起来像这样:
db.users.findOne() =>
{
"name" : "xxxx",
"emails" : [
{ address: "one@domain.com", validated: false },
{ address: "two@domain.com", validated: true }
]
}
您可以在email.address字段中定义一个唯一索引,如下所示:
db.users.ensureIndex(['emails.address',1], {unique: true})
现在,如果您尝试两次插入相同的电子邮件地址,则会收到错误消息。它还可以帮助您通过电子邮件地址优化查找用户,这在某个时刻对您的应用程序非常有用。