查询数组中的重复元素(MongoDB)

时间:2014-03-13 16:19:41

标签: arrays mongodb

我有一个带有数组字段的mongodb集合,其中包含一个字符串列表。这些字符串中可能会有重复。例如:

doc1 = {a: ["p", "q", "r", "p", "r"]}
doc2 = {a: ["p", "q", "q"]}
doc3 = {a: ["p"]}
doc4 = {a: ["p", "r", "r"]}

我想找到所有文件,给定一个字符串(例如," p"),查找在数组中至少有两次字符串的所有文档。

例如:

query("p") == [doc1]
query("q") == [doc2]
query("r") == [doc1, doc4]

有没有办法在mongo中直接执行此操作?我知道我可以查询一次,然后在我的应用程序中过滤结果,但我宁愿避免这种情况。

2 个答案:

答案 0 :(得分:2)

您可以尝试下面的内容。此查询返回与您的查询匹配的文档的_id以及计数。

db.mycoll.aggregate([
    {$unwind:"$a"}, 
    {$group:{_id:{_id:"$_id", a:"$a"}, count:{$sum:1}}}, 
    {$match:{"_id.a":"r", count:{$gte:2}}}, 
    {$project:{_id:0, id:"$_id._id", count:1}}
])

请注意$ match阶段包含“p”。您可以用“q”或“r”替换它

答案 1 :(得分:1)

var search = 'r';
docs.aggregate([
  {$match: { a : search } }, //step 1, filter to the arrays we care about for speed
  //could do a project here to trim fields depending on object size
  {$unwind: '$a'}, //unwind to create a separate row for each letter
  { $group: { _id: '$_id', total: { $sum: { $cond : [ { $eq: ['$a', search] }, 1, 0] } } } }, //the real work, explained below
  {$match : {total : {$gte: 2} } } //grab the summed items with at least 2
  {$project: {_id: 1} } //grab just the _id field
]  )

注意:

我相信$ elemMatch不会工作,因为它总是找到数组中的第一项,而不是数组中的每一项。

实际工作发生在$ group调用中,其中$ sum基于查找您在数组中搜索的元素的条件。这是有效的,因为我们已将它们解开为单独的行。

享受!