在 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(在数学意义上)的主要内容,如果未能解决你的问题,请参考以下文章

用 MongoDB 嵌入集合(子文档数组)违反 REST?

mongo 模式(嵌入与参考)[重复]

每天学一点 Kotlin -- 集合:Set

在 Mongo 集合中更新数组中的一条记录

java中 列表,集合,数组之间的转换

Mongo 计数所有集合文档中出现的数组项