首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于数组集合的mongodb唯一索引

基于数组集合的mongodb唯一索引
EN

Stack Overflow用户
提问于 2018-12-16 22:58:22
回答 3查看 49关注 0票数 2

假设我有这份文件:

代码语言:javascript
运行
复制
{ accounts: [1, 2] }

我应该无法添加新文档

代码语言:javascript
运行
复制
{ accounts: [2, 1] }

但我应该能加上

代码语言:javascript
运行
复制
{ accounts: [1, 3] }

有什么方法可以创建这样的唯一索引吗?我目前的解决方案是检查它是否是一个尚未定义的子集。

EN

回答 3

Stack Overflow用户

发布于 2018-12-16 23:20:34

您可以利用$all运算符构建查询条件,

代码语言:javascript
运行
复制
db.col.update({ accounts: { $not: { $all: [2, 1] } } }, { $push: { accounts: { $each: [ 2, 1 ] } } }) // will return no match

代码语言:javascript
运行
复制
db.col.update({ accounts: { $not: { $all: [1, 3] } } }, { $push: { accounts: { $each: [ 1, 3 ] } } })

将成功更新您的文档,因为并非所有元素都出现在accounts数组中

编辑:为了防止插入文档,您需要一个带有unique参数的索引。默认情况下,MongoDB为数组中的每个元素创建单独的索引项,这意味着您只能插入1一次。作为一种变通方法,您可以尝试使用数组索引创建复合索引:

代码语言:javascript
运行
复制
db.col.createIndex( { "accounts.0": 1, "accounts.1": 1 }, { unique: true } )

这要求数字对是唯一的,但这里的顺序很重要,因此您必须强制应用程序以有序数组的形式插入accounts

票数 2
EN

Stack Overflow用户

发布于 2018-12-17 07:27:20

您可以尝试使用$addToSet。它将确保数组包含所有唯一的值。

https://docs.mongodb.com/manual/reference/operator/update/addToSet/

这是你想要的吗?

票数 0
EN

Stack Overflow用户

发布于 2018-12-17 07:38:24

唯一索引(包括数组)在Mongo的文档here中描述得很好,你读过吗?

顺便说一句,如果你解释了这个问题,你会得到更好的反馈。

我猜你的解决方案可以工作,如果你不需要有一个以上的空键文档(请参考手册)。数组被视为集合,因此如果存在1,2,则在存在唯一索引的情况下将拒绝2,1。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53803368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档