计算Mongodb中数组中的出现次数

计算Mongodb中数组中的出现次数,mongodb,aggregation-framework,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',

我在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次类别

解决这个问题的最好办法是什么? 我应该使用聚合框架吗?或者没有聚合框架有什么简单的方法吗?

您可以使用操作符来实现这一点

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 }
在线试用:

您可以使用运算符实现此功能

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 }

联机尝试:

您可以使用
$setcrossion
尝试
$redact
进行查询

$setIntersection
cat
数组与公共名称文档的输入数组和返回数组进行比较,后跟
$size
$redact
,并将结果与3进行比较以保留文档,否则删除文档

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

您可以使用
$setcrossion
尝试
$redact
进行查询

$setIntersection
cat
数组与公共名称文档的输入数组和返回数组进行比较,后跟
$size
$redact
,并将结果与3进行比较以保留文档,否则删除文档

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

非常好和干净的解决方案!非常好和干净的解决方案!非常好和干净的解决方案!非常好和干净的解决方案!