mongodb - Mongo 中唯一的数组值

标签 mongodb indexing unique

我很难找到一种方法使集合索引按我需要的方式工作。该集合有一个包含两个元素的数组,并且没有其他数组可以包含这两个元素(以任何顺序):

db.collection.insert(users : [1,2] // should be valid
db.collection.insert(users : [2,3] // should be valid
db.collection.insert(users : [1,3] // should be valid
db.collection.insert(users : [3,2] // should be invalid, since there's another array with that same value.

但是,如果我使用db.collection.createIndex({users:1}, {unique: true}) ,它不允许我拥有两个具有公共(public)元素的数组:

db.collection.insert(users : [1,2] // valid
db.collection.insert(users : [2,3] // invalid, since 2 is already on another document

我尝试的解决方案之一是使数组更深一层。创建完全相同的索引,但添加稍有不同的文档将使其几乎符合我需要的方式,但它仍然允许两个数组以相反的顺序具有相同的值:

db.chat.insert({ users : { people :  [1,2] }}) // valid
db.chat.insert({ users : { people :  [2,3] }}) // valid
db.chat.insert({ users : { people :  [2,1] }}) // valid, but it should be invalid, since there's another document with [1,2] array value.
db.chat.insert({ users : { people :  [1,2] }}) // invalid

有没有办法在索引级别上实现这一目标?

最佳答案

mongodb 不会在整个数组上创建索引。但是...

我们想要一个原子操作插入更新,并保证数组内容的唯一性?然后,我们需要计算一个特征,该特征对于数组项的所有排列都是相同的,并为其创建唯一索引。

一种方法是对数组项进行排序(解决排列问题)并将它们连接起来(创建一个功能)。 javascript 中的示例:

function index(arr) {
  return arr.sort().join();
}

users1 = [1, 2], usersIndex1 = index(users1); // "1,2"
users2 = [2, 1], usersIndex2 = index(users2); // "1,2"

// Create the index
db.collection.ensureIndex({usersIndex: 1}, {unique: true});
// 
db.collection.insert({users: users1, usersIndex: usersIndex1}); // Ok
db.collection.insert({users: users2, usersIndex: usersIndex2}); // Error

如果数组很长,您可以对字符串应用哈希函数,从而最小化集合的大小。不过,它是以可能发生冲突为代价的。

关于mongodb - Mongo 中唯一的数组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39644676/

相关文章:

r - 获取在矩阵的行中保存最大值的列名,在数组中保存单独的最大值

java - 给定字符串,单词之间有空格。用 Java 获取数组中的每个单词

mysql - 在 MySQL 中生成唯一的 10 个字符的字母数字哈希

node.js - mongodb:加密字段的唯一索引

c++ - 查找所选对象的索引

c# - 如何从 MongoDB 中选择选定的值?

c# - 如何使用 C# 在 DataGridView 中制作一个唯一的列?

php - 创建独特的页面标题 slugs php

sql查询到mongodb?

javascript - Express - 更新对数据库MongoDB不生效