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

Javascript 基于数组集合的mongodb唯一索引,javascript,mongodb,Javascript,Mongodb,如果我有文件,请说: { accounts: [1, 2] } 我应该无法添加新文档 { accounts: [2, 1] } 但我应该可以补充一点 { accounts: [1, 3] } 有没有办法创建这样一个唯一的索引?我当前的解决方案是检查它是否是尚未定义的子集。您可以利用运算符构建查询条件 db.col.update({ accounts: { $not: { $all: [2, 1] } } }, { $push: { accounts: { $each: [ 2, 1 ] }

如果我有文件,请说:

{ accounts: [1, 2] }
我应该无法添加新文档

{ accounts: [2, 1] }
但我应该可以补充一点

{ accounts: [1, 3] }
有没有办法创建这样一个唯一的索引?我当前的解决方案是检查它是否是尚未定义的子集。

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

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

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

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

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

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

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

这就是你想要的吗?

Mongo的文档中对唯一索引(包括数组)的描述非常好,你读过吗

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


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

啊,对不起,我的意思是将其作为新文档添加到集合中。@a.Lau修改了我的答案,这是一种变通方法,因此我不确定这是否有助于您的情况不幸的是,顺序确实重要,因为我在做一种朋友联系的事情。因此,第一个元素始终是请求者,第二个元素是请求者。因此,如果状态为“待定”,那么第二个元素应该是具有“接受”和“拒绝”选项的用户,而第一个元素将只获得“取消”选项。在发布自己的答案之前,您先阅读投票最多的答案如何?
db.col.createIndex( { "accounts.0": 1, "accounts.1": 1 }, { unique: true } )