在 mongo 集合中嵌入数组作为 Set(在数学意义上)
Posted
技术标签:
【中文标题】在 mongo 集合中嵌入数组作为 Set(在数学意义上)【英文标题】:Embedded array as a Set (in the mathematica sense) in a mongo collection 【发布时间】:2012-04-08 07:48:06 【问题描述】:我放入集合中的对象的“模式”如下所示:
name : "Niranjan", //<--key
children : ["Suraj", "kalidas", "Suraj"]
但我想确保将孩子视为一个集合 - 在上面的示例中,我希望 Mongo 不接受记录,因为“Suraj”在数组中出现了两次。
我尝试为 name 和 children 创建一个唯一索引
db.folks.ensureIndex(name:1,children:1,unique:true)
然而,它的作用是在任何子名 + 民间名上创建一个全局唯一索引。也就是说,如果我没有唯一的名称索引,我将能够执行以下操作:
db.folks.insert(name:'p',children:['c1','c2'])
db.folks.insert(name:'p',children:['c3'])
因为 p+c1、p+c2 和 p+c3 是不同的。如果我尝试插入以下内容:
db.folks.insert(name:'p',children:['c4','c1'])
那我会得到
E11000 duplicate key error index: test.folks.$name_1_children_1 dup key: : "p", : "c1"
有没有办法在不做的情况下实现这一点 check during insertion as in https://***.com/questions/9640233/unique-array-values-in-mongoose?
【问题讨论】:
【参考方案1】:在 MongoDB 的未来版本中,唯一索引将按照您期望的方式运行:
https://jira.mongodb.org/browse/SERVER-1068
目前,您需要在插入之前检查应用程序中的唯一性。
顺便说一句,当您更新文档时,您可以使用 $addToSet 而不是 $push 来强制执行唯一性:
http://www.mongodb.org/display/DOCS/Updating#Updating-%24addToSetand%24each
【讨论】:
哦,抱歉,您要检查插入。在您的应用程序中检查它; MongoDB 无法为您强制执行。 @Jesse,在这种情况下,mongo 是否支持(或未来计划支持)类似于“触发器”的东西,以便我可以强制执行此类约束甚至更一般的约束(以速度为代价以及面对分片和分布式特性的复杂性)? 我之前没有给你一个好的答案。请参阅 jira.mongodb.org/browse/SERVER-1068 ,您想要做的事情计划在未来的版本中。我已经编辑了我的答案以包含它。但是,除了唯一索引之外,MongoDB 中可能不会有更复杂的约束或触发器。要使用 MongoDB,请改变您的想法,期望数据库服务器中的逻辑少于您在 SQL 服务器中所习惯的逻辑。在应用程序中执行业务逻辑,并使用 MongoDB 存储和检索数据。 嘿@UstamanSangat,这个答案是完整的还是您需要更多信息?以上是关于在 mongo 集合中嵌入数组作为 Set(在数学意义上)的主要内容,如果未能解决你的问题,请参考以下文章