MongoDB聚合匹配结果计数

3
我正在使用一个有许多重复键的MongoDB集合。我经常进行聚合查询以找出这些重复,以便我可以深入挖掘并了解它们之间的差异。
不幸的是,数据库非常庞大,重复通常是有意的。我想做的是找到具有重复键的数量,而不是打印成千上万行输出结果。这可行吗?
(附注:我所有的查询都是通过shell完成的,因此首选不需要外部工具或大量代码的解决方案,但我知道这并非总是可能的。)
示例记录:
{ "_id" : 1, "type" : "example", "key" : "111111", "value" : "abc" }
{ "_id" : 2, "type" : "example", "key" : "222222", "value" : "def" }
{ "_id" : 3, "type" : "example", "key" : "222222", "value" : "ghi" }
{ "_id" : 4, "type" : "example", "key" : "333333", "value" : "jkl" }
{ "_id" : 5, "type" : "example", "key" : "333333", "value" : "mno" }
{ "_id" : 6, "type" : "example", "key" : "333333", "value" : "pqr" }
{ "_id" : 7, "type" : "example", "key" : "444444", "value" : "stu" }
{ "_id" : 8, "type" : "example", "key" : "444444", "value" : "vwx" }
{ "_id" : 9, "type" : "example", "key" : "444444", "value" : "yz1" }
{ "_id" : 10, "type" : "example", "key" : "444444", "value" : "234" }

这是我一直使用的查询语句,用于基于 key 查找重复项:

db.collection.aggregate([
    {
        $match: {
            type: "example"
        }
    },
    {
        $group: {
            _id: "$key",
            count: {
                $sum: 1
            }
        }
    },
    {
        $match: {
            count: {
                $gt: 1
            }
        }
    }
])

这将给我一个输出:

{
  "_id": "222222",
  "count": 2
},
{
  "_id": "333333",
  "count": 3
},
{
  "_id": "444444",
  "count": 4
}

我想要得到的结果是:
3

在 $match 后添加 {$count:"count"}。 - s7vr
@Veeram 谢谢你! - alyrichardson
2个回答

10

您已经接近成功,只需要添加最后一个$count

db.collection.aggregate([
  {
    $match: {
      type: "example"
    }
  },
  {
    $group: {
      _id: "$key",
      count: {
        $sum: 1
      }
    }
  },
  {
    $match: {
      count: {
        $gt: 1
      }
    }
  },
  {
    $count: "count"
  }
])

非常感谢!这似乎是正确的解决方案,但显然我们仍在使用MongoDB v3.2,当我尝试使用它时出现错误。我找到了另一种(更加hacky)的方法,是同事给我的。我将其发布为另一个解决方案。 - alyrichardson

2

Akrion's answer 看起来是正确的,但我无法测试它,因为我们使用的是旧版本的MongoDB。我的同事给了我一种替代方案,在3.2上可以工作(不确定其他版本是否可行)。

添加.toArray()将结果转换为数组,然后可以使用.length获取数组的大小。

db.collection.aggregate([
    {
        $match: {
            type: "example"
        }
    },
    {
        $group: {
            _id: "$key",
            count: {
                $sum: 1
            }
        }
    },
    {
        $match: {
            count: {
                $gt: 1
            }
        }
    }
]).toArray().length

这是一个不好的想法。你只需要文档的总数。然而,用上述方法,你会收到不必要的文档。 - Laode Muhammad Al Fatih
不,我需要的是在单个$match阶段后重复键的总数。在学习了更多关于MongoDB的知识之后,我正在回顾这个问题和已接受的答案,它们对我的情况是正确的。 - alyrichardson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接