Mongodb 名称属性的前n个字母相等

Mongodb 名称属性的前n个字母相等,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有mongo collectionperson,其名称值如下: aaaaaa aaaabb aaabbb aabbcc aabccc aacccc count: 3, [aaaaaa, aaaabb, aaabbb] count: 2, [aabbcc, aabccc] count: 1, [aacccc] 我想找到所有前三个字母相同的名字。所以结果应该是这样的: aaaaaa aaaabb aaabbb aabbcc aabccc aacccc count: 3, [aaaaaa, a

我有mongo collection
person
,其名称值如下:

aaaaaa
aaaabb
aaabbb
aabbcc
aabccc
aacccc
count: 3, [aaaaaa, aaaabb, aaabbb]
count: 2, [aabbcc, aabccc]
count: 1, [aacccc]
我想找到所有前三个字母相同的名字。所以结果应该是这样的:

aaaaaa
aaaabb
aaabbb
aabbcc
aabccc
aacccc
count: 3, [aaaaaa, aaaabb, aaabbb]
count: 2, [aabbcc, aabccc]
count: 1, [aacccc]
我知道这是某种聚合,但我自己并没有找到精确的匹配查询


有这样的疑问吗

您可以在
$project
阶段中使用
$substr
操作符来获取名称的前n个字符(n-前缀)
$substr
用于从字符串中获取子字符串。然后,使用
$group
阶段按前缀分组,并使用
$sum
运算符计算组中的名称,使用
$push
运算符将名称添加到列表中。(可选)使用
$sort
阶段,按计数排序

您的管道将如下所示:

db.person.aggregate([
    {"$project":
        {"name":1, 
        "3name":{"$substr":["$name", 0, 3]}
        }
    }, 
    {"$group": 
        {"_id":"$3name", 
        nameList:{"$push" : "$name"}, 
        "count":{"$sum":1}
        }
    }, 
    {"$sort" : {"count":-1}}
])
样本输出:

{ "_id" : "aaa", "nameList" : [ "aaaaaa", "aaaabb", "aaabbb" ], "count" : 3 }
{ "_id" : "aab", "nameList" : [ "aabbcc", "aabccc" ], "count" : 2 }
{ "_id" : "aac", "nameList" : [ "aacccc" ], "count" : 1 }
或者您可以直接在$group阶段使用$substr

db.person.aggregate([        
    {"$group": 
        {"_id":{"$substr":["$name", 0, 3]}, 
        nameList:{"$push" : "$name"}, 
        "count":{"$sum":1}
        }
    }, 
    {"$sort" : {"count":-1}}
])

您可以在
$project
阶段中使用
$substr
运算符来获取名称的前n个字符(n-前缀)
$substr
用于从字符串中获取子字符串。然后,使用
$group
阶段按前缀分组,并使用
$sum
运算符计算组中的名称,使用
$push
运算符将名称添加到列表中。(可选)使用
$sort
阶段,按计数排序

您的管道将如下所示:

db.person.aggregate([
    {"$project":
        {"name":1, 
        "3name":{"$substr":["$name", 0, 3]}
        }
    }, 
    {"$group": 
        {"_id":"$3name", 
        nameList:{"$push" : "$name"}, 
        "count":{"$sum":1}
        }
    }, 
    {"$sort" : {"count":-1}}
])
样本输出:

{ "_id" : "aaa", "nameList" : [ "aaaaaa", "aaaabb", "aaabbb" ], "count" : 3 }
{ "_id" : "aab", "nameList" : [ "aabbcc", "aabccc" ], "count" : 2 }
{ "_id" : "aac", "nameList" : [ "aacccc" ], "count" : 1 }
或者您可以直接在$group阶段使用$substr

db.person.aggregate([        
    {"$group": 
        {"_id":{"$substr":["$name", 0, 3]}, 
        nameList:{"$push" : "$name"}, 
        "count":{"$sum":1}
        }
    }, 
    {"$sort" : {"count":-1}}
])

我不认为一个查询就可以实现它,但是正如您所说的聚合有一个范围。我不打算写确切的汇总,但可以提出一个管道的想法,在我看来可以实现它

首先,您需要在管道中使用$project创建一个新的有效say前缀,该值应该是人名的前三个字母,比如
前缀:{$substr:[“$name”,0,3]}

其次,在管道中,您可以对创建的前缀变量调用$group和$sum:1以获取计数

这将为您提供一个文档列表,其中每个前缀都包含名称计数


您可以增强以获取更多数据或以不同的方式获取数据

我不认为一个查询就可以实现它,但是正如您所说的聚合有一个范围。我不打算写确切的汇总,但可以提出一个管道的想法,在我看来可以实现它

首先,您需要在管道中使用$project创建一个新的有效say前缀,该值应该是人名的前三个字母,比如
前缀:{$substr:[“$name”,0,3]}

其次,在管道中,您可以对创建的前缀变量调用$group和$sum:1以获取计数

这将为您提供一个文档列表,其中每个前缀都包含名称计数


您可以增强以获取更多数据或以不同的方式获取数据

你试过使用正则表达式吗?是的,如果我已经知道我一直想找到的字符串,正则表达式将是我的首选。我希望统计/聚合数据库中前n个字母相同的所有文档(在我的案例3中)。但是,也许我的正则表达式已经生锈了,请帮忙:)你试过使用正则表达式吗?是的,如果我已经知道我一直想找到的字符串,正则表达式将是我的首选。我希望统计/聚合数据库中前n个字母相同的所有文档(在我的案例3中)。但是,也许我的正则表达式已经生锈了,请帮助:)就是这样。将
{“$substr”:[“$name”,0,3]}
移动到
$group
阶段,并移除
$project
阶段,我投你一票:)@Styvane:谢谢你的改进建议。没有想到。就是这样。将
{“$substr”:[“$name”,0,3]}
移动到
$group
阶段,并移除
$project
阶段,我投你一票:)@Styvane:谢谢你的改进建议。我没想到。