2016-10-17 41 views
2

我有一个字符串如何确定数组在MongoDB中具有唯一条目?

users: ['user1', 'user2'] 

数组如果我运行的顺序搜索寻找确切[“用户1”,“user2的”],它会发现该条目。但是,如果他们回到前面,查询不会返回任何内容。

将输入数组与数据库中的列表进行比较以确定它是否是唯一条目的最佳方法是什么?

+0

请看看这个:[mongodb distinct](https://docs.mongodb.com/v3.2/reference/method/db.collection.distinct/) –

回答

0

使用聚合框架与$redact管道运营商允许你用$cond操作proccess逻辑条件和使用专项行动$$KEEP“保持”的文件,其中的逻辑条件为真或$$PRUNE在条件错误的情况下“移除”文档。

此操作类似于具有$project管线选择所述集合中的字段,并创建保持从逻辑条件查询,然后随后的$match结果的新的领域,不同之处在于$redact用途一个更加高效的单一管道阶段。

至于逻辑条件,您可以使用Set Operators,因为它们允许在数组上执行集操作的表达式,将数组视为集。设置表达式会忽略每个输入数组中的重复条目和元素的顺序,这是您的案例中的合适属性,因为您想要忽略元素的顺序。

有一对夫妇这些运营商,你可以用它来进行逻辑条件,即$setIsSubset$setDifference的。


考虑以下实例证明上述概念:

填充测试集

db.collection.insert([ 
    { users: ['user1', 'user2'] }, 
    { users: ['user1', 'user2', 'user2'] }, 
    { users: ['user1', 'user2', 'user3'] }, 
    { users: ['user1', 'user3'] }, 
]) 

实施例1:$redact$setEquals

var arr = [ "user2", "user1" ]; 
db.collection.aggregate([ 
    { 
     "$redact": { 
      "$cond": [ 
       { "$setEquals": [ "$users", arr ] }, 
       "$$KEEP", 
       "$$PRUNE" 
      ] 
     } 
    } 
]) 

样本输出

/* 1 */ 
{ 
    "_id" : ObjectId("5804902900ce8cbd028523d1"), 
    "users" : [ 
     "user1", 
     "user2" 
    ] 
} 

/* 2 */ 
{ 
    "_id" : ObjectId("5804902900ce8cbd028523d2"), 
    "users" : [ 
     "user1", 
     "user2", 
     "user2" 
    ] 
} 

实施例2:$redact$setDifference

var arr = [ "user2", "user1" ]; 
db.collection.aggregate([ 
    { 
     "$redact": { 
      "$cond": [ 
       { 
        "$eq": [ 
         { "$setDifference": [ "$users", arr ] }, 
         [] 
        ] 
       }, 
       "$$KEEP", 
       "$$PRUNE" 
      ] 
     } 
    } 
]) 

样本输出

/* 1 */ 
{ 
    "_id" : ObjectId("5804902900ce8cbd028523d1"), 
    "users" : [ 
     "user1", 
     "user2" 
    ] 
} 

/* 2 */ 
{ 
    "_id" : ObjectId("5804902900ce8cbd028523d2"), 
    "users" : [ 
     "user1", 
     "user2", 
     "user2" 
    ] 
} 

另一种方法,虽然只是建议在$redact不可用,将使用$where操作为:

db.collection.find({ 
    "$where": function() { 
     var arr = ["user2", "user1"]; 
     return !(this.users.sort() > arr.sort() || this.users.sort() < arr.sort()); 
    } 
}) 

但是,请记住,这将不会很好地执行,因为操作符调用时的查询操作与$where e JavaScript引擎评估每个文档的Javascript代码并检查每个文档的条件。

这是非常缓慢,因为MongoDB的前$where表达式计算非$where查询操作和非$where查询语句可以使用索引。

如果可以的话,建议将索引查询组合起来,以便查询速度更快。但是,如果不能以任何其他方式构建数据,或者处理少量数据时,建议使用JavaScript表达式和运算符作为最后的手段。

1

通过以下查询,您可以识别集合中的唯一数组。

db.getCollection('mycollection').find({users: { $size: 2, $all: [ "user1" , "user2" ] }}) 

你需要提到的号码。您正在检查的数组中的元素,并通过$ all操作符检查其中的所有元素。

相关问题