如果我有文件,那就说
{ accounts: [1, 2] }
我应该无法添加新文档
{ accounts: [2, 1] }
但我应该可以添加
{ accounts: [1, 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]。