我试图弄清楚如何最好地将 MongoDB 用于一个非常小而简单的用例,但发现文档有些令人困惑。我的文档应该代表一个用户可以拥有许多电子邮件的事实。如果我遵循文档,最明显和最简单的解决方案是使用嵌入。问题是当我想验证电子邮件地址的唯一性时,这是 AFAIK 无法使用嵌入的(当然我可以使用 map/reduce,但这似乎是一个非常糟糕的选择)。
我绝对觉得电子邮件不值得拥有自己的收藏,但显然嵌入式对象不允许我进行验证(如果确实如此,我真的不相信它会有效)。在这种情况下,您将如何设计架构?
我试图弄清楚如何最好地将 MongoDB 用于一个非常小而简单的用例,但发现文档有些令人困惑。我的文档应该代表一个用户可以拥有许多电子邮件的事实。如果我遵循文档,最明显和最简单的解决方案是使用嵌入。问题是当我想验证电子邮件地址的唯一性时,这是 AFAIK 无法使用嵌入的(当然我可以使用 map/reduce,但这似乎是一个非常糟糕的选择)。
我绝对觉得电子邮件不值得拥有自己的收藏,但显然嵌入式对象不允许我进行验证(如果确实如此,我真的不相信它会有效)。在这种情况下,您将如何设计架构?
您可以在设置了 { 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})
现在,如果您尝试两次插入相同的电子邮件地址,您将收到错误消息。它还将帮助您优化通过电子邮件地址查找用户的方式,这在您的应用程序中一定会在某些时候有用。