Mongodb 名称属性的前n个字母相等
我有mongo collectionMongodb 名称属性的前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
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:谢谢你的改进建议。我没想到。