基于数组的mongodb唯一索引

时间:2018-12-16 14:58:22

标签: javascript mongodb

如果我有文件,那就说

{ accounts: [1, 2] }

我应该无法添加新文档

{ accounts: [2, 1] }

但我应该可以添加

{ accounts: [1, 3] }

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

3 个答案:

答案 0 :(得分:2)

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

db.col.update({ accounts: { $not: { $all: [2, 1] } } }, { $push: { accounts: { $each: [ 2, 1 ] } } }) // will return no match

同时

db.col.update({ accounts: { $not: { $all: [1, 3] } } }, { $push: { accounts: { $each: [ 1, 3 ] } } })

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

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

db.col.createIndex( { "accounts.0": 1, "accounts.1": 1 }, { unique: true } )

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

答案 1 :(得分:0)

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

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

这是您想要的吗?

答案 2 :(得分:0)

Mongo的文档in this thread中很好地描述了唯一索引(包括数组),您读过吗?

顺便说一句,如果您解释问题,将会得到更好的反馈。

我猜想如果您不需要> 1个带有空键的文档(请参阅手册),您的解决方案就可以使用。数组被视为集合,因此如果存在[1,2],则在存在唯一索引的情况下将拒绝[2,1]。