我正在使用一个有很多重复键的MongoDB集合。我定期进行汇总查询,以找出那些重复项,以便深入挖掘并找出它们之间的不同之处。
不幸的是,数据库很大,经常有意重复。我想做的是找到具有重复项的键的 count ,而不是打印具有数千行输出的结果。这可能吗?
(侧面注:我通过外壳进行所有查询,因此不需要外部工具或大量代码的解决方案将是首选,但是我知道这并不总是可能的。)
示例记录:
{ "_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
答案 0 :(得分:0)
您快到了,只是错过了最后一个$count
:
db.collection.aggregate([
{
$match: {
type: "example"
}
},
{
$group: {
_id: "$key",
count: {
$sum: 1
}
}
},
{
$match: {
count: {
$gt: 1
}
}
},
{
$count: "count"
}
])
答案 1 :(得分:0)
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