我有一个带有数组字段的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中直接执行此操作?我知道我可以查询一次,然后在我的应用程序中过滤结果,但我宁愿避免这种情况。
答案 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基于查找您在数组中搜索的元素的条件。这是有效的,因为我们已将它们解开为单独的行。
享受!