计算Mongodb

时间:2017-03-14 11:01:55

标签: mongodb aggregation-framework

我在Mongo有这样的文件:

{
  _id: 1,
  cat: ['a', 'b, 'c', 'd', 'e']
},
{
  _id: 2,
  cat: ['f', 'g, 'h', 'i', 'j']
},
{
  _id: 3,
  cat: ['a', 'b, 'f', 'g', 'h']
},
{
  _id: 4,
  cat: ['i', 'j, 'c', 'd', 'e']
}

我必须在我拥有的集合中过滤至少n次出现(让'说3')'cat'的文件,即:

['a', 'b', 'c', 'f']

因此,在这种情况下,只应返回_id等于1和3的文档,因为它们都至少有3次出现在请求的数组中。

解决此问题的最佳方法是什么? 我应该继续聚合框架,还是有没有简单的方法可以做到?

2 个答案:

答案 0 :(得分:2)

您可以使用$setIntersection运算符

来实现此目的
db.collection.aggregate(
   [
     {$project: {cat: 1, inter: { $setIntersection: [ "$cat", ['a', 'b', 'c', 'f'] ] } } }, 
     {$project: {cat: 1, size: {$size: "$inter"}}},
     {$match: {size: {$gte: 3}}}
   ]
)

输出:

{ "_id" : 1, "cat" : [ "a", "b", "c", "d", "e" ], "size" : 3 }
{ "_id" : 3, "cat" : [ "a", "b", "f", "g", "h" ], "size" : 3 }

在线试用:mongoplayground.net/p/Bv-Tdl5ii7l

答案 1 :(得分:1)

您可以尝试$redact $setIntersection来查询。

$setIntersectioncat数组与输入数组进行比较并返回公共名称文档的数组,后跟$size$redact,并将结果与​​3进行比较以保留并删除文件。

db.collection.aggregate(
    [{
        $redact: {
            $cond: {
                if: {
                    $gte: [{
                        $size: {
                            $setIntersection: ["$cat", ['a', 'b', 'c', 'f']]
                        }
                    }, 3]
                },
                then: "$$KEEP",
                else: "$$PRUNE"
            }
        }
    }]
)