聚合查询的计数不正确
Posted
技术标签:
【中文标题】聚合查询的计数不正确【英文标题】:Incorrect count from aggregation query 【发布时间】:2020-11-25 08:35:25 【问题描述】:在以下文档集合中,我试图找到唯一句子的总单词。总字数必须为 5(hello\nworld,你好吗?) + 5(hello world,我很好) + 3(下雨了吗?) + 5(看看美丽的老虎!) = 18
[
"sourceList": [
"source": "hello\nworld, how are you?",
"_id": ObjectId("5f0eb9946db57c0007841153")
,
"source": "hello world, I am fine",
"_id": ObjectId("5f0eb9946db57c0007841153")
,
"source": "Is it raining?",
"_id": ObjectId("5f0eb9946db57c0007841153")
]
,
"sourceList": [
"source": "Look at the beautiful tiger!",
"_id": ObjectId("5f0eb9946db57c0007841153")
,
"source": "Is it raining?",
"_id": ObjectId("5f0eb9946db57c0007841153")
]
]
但是用下面的查询
db.collection.aggregate([
"$unwind": "$sourceList"
,
$project:
"sp":
$split: [
"$sourceList.source",
"\n"
],
$split: [
"$sourceList.source",
" "
]
,
"$group":
"_id": null,
"elements":
$addToSet: "$sp"
,
"$unwind": "$elements"
,
"$project":
"sizes":
"$size": "$elements"
,
"$group":
"_id": null,
"count":
"$sum": "$sizes"
])
它给出17
。这可能是什么原因?我首先尝试按\n
拆分,然后按space
拆分
编辑
我正在尝试查找唯一句子的字数和唯一句子总数。
【问题讨论】:
您是在寻找全部独特的句子还是全部独特的词或两者兼而有之? @Gibbs 唯一句子总数和唯一单词总数 你期待 4 和 18? @Gibbs 是的.....我抓取了一个网站,将所有文本插入 mongo。之后,我需要计算唯一句子的总字数以及唯一句子的总数。 @Gibbs 请注意,我正在尝试对唯一句子进行字数统计,而不是对唯一句子进行唯一字数统计 【参考方案1】:问题出在这里:
"sp":
$split: [
"$sourceList.source",
"\n"
],
$split: [
"$sourceList.source",
" "
]
只有第二个 $split
被 MongoDB 执行,它返回 hello\nworld
作为一个字符串。没有这样的“级联”语法,因为它只是相同的 JSON 密钥 $split
所以最后获胜。
为了解决这个问题,您可以使用$reduce 在由\n
值拆分的数组上按空格应用$split
:
$project:
"sp":
$reduce:
input: $split: [ "$sourceList.source", "\n" ] ,
initialValue: [],
in: $concatArrays: [ "$$value", $split: [ "$$this", " " ] ]
Mongo Playground
【讨论】:
您的查询与@gibbs 发布的查询有何不同?我正在尝试找出独特句子的字数以及独特句子的总数 @Amanda mine 是首先添加的,我的目标是回答为什么这个数字与18
不同,这是您最初的问题。不知道当时发生了什么:-)
也在编辑中添加,我正在尝试查找唯一句子的字数和唯一句子总数。这个查询是否给出了唯一句子的字数?
是的,@micki 是正确的。他解决了你的主要问题。根据您的评论,我解决了您的两个计数问题。我希望我能批准这个答案:)
@Gibbs 在这个问题上我们俩都享有足够的声誉 :-)【参考方案2】:
根据 cmets 以及 @micki 的回答和我之前的回答,
play
db.collection.aggregate([
"$unwind": "$sourceList"
,
$project:
"sp":
$reduce:
input:
$split: [
"$sourceList.source",
"\n"
]
,
initialValue: [],
in:
$concatArrays: [
"$$value",
$split: [
"$$this",
" "
]
]
,
"$group":
"_id": null,
"elements":
$addToSet: "$sp"
,
"$project":
"unique_sen":
"$size": "$elements"
,
"elements": 1
,
"$unwind": "$elements"
,
"$project":
"sizes":
"$size": "$elements"
,
"unique_sen": 1
,
"$group":
"_id": null,
"unique_count":
"$sum": "$sizes"
,
"data":
$push: "$$ROOT"
,
"$project":
"unique_count": 1,
"unique_sen":
$first: "$data.unique_sen"
])
更新:
您不需要在查询中转义。
play
db.collection.aggregate([
"$match":
"url": "https://www.rootsresource.in"
,
"$unwind": "$translations"
,
$project:
"sp":
$reduce:
input:
$split: [
"$translations.source",
"\n"
]
,
initialValue: [],
in:
$concatArrays: [
"$$value",
$split: [
"$$this",
" "
]
]
,
"$group":
"_id": null,
"elements":
$addToSet: "$sp"
,
"$project":
"unique_sen":
"$size": "$elements"
,
"elements": 1
,
"$unwind": "$elements"
,
"$project":
"sizes":
"$size": "$elements"
,
"unique_sen": 1
,
"$group":
"_id": null,
"unique_count":
"$sum": "$sizes"
,
"data":
$push: "$$ROOT"
,
"$project":
"unique_count": 1,
"unique_sen":
$first: "$data.unique_sen"
])
更新:
以上查询适用于 mongo 4.4 - $first 在 4.4 的项目中可用
对于旧版本。
db.test.aggregate([
"$match":
url: "https://www.rootsresource.in"
,
"$unwind": "$translations"
,
$project:
"sp":
$reduce:
input:
$split: [
"$translations.source",
"\n"
]
,
initialValue: [],
in:
$concatArrays: [
"$$value",
$split: [
"$$this",
" "
]
]
,
"$group":
"_id": null,
"elements":
$addToSet: "$sp"
,
"$project":
"unique_sen":
"$size": "$elements"
,
"elements": 1
,
"$unwind": "$elements"
,
"$project":
"sizes":
"$size": "$elements"
,
"unique_sen": 1
,
"$group":
"_id": null,
"unique_count":
"$sum": "$sizes"
,
"data":
$push: "$$ROOT"
,
"$project":
"unique_count": 1,
unique_sen: $arrayElemAt: [ "$data.unique_sen", 0 ]
])
【讨论】:
直接在 mongo 中绑定这个会出错。截图ibb.co/x1tnFL9 play - 你能用你正在尝试的游戏更新查询吗? 它在您删除匹配项时提供。匹配错误与图像中的不同。 不知道为什么。但我在 Robo3T 中运行查询 上面写着Unrecognized expression '$first
以上是关于聚合查询的计数不正确的主要内容,如果未能解决你的问题,请参考以下文章
使用 group by 聚合计数 > 100 万用户 的 Mysql 查询性能变慢
使用聚合查询获取具有总交易计数和交易详细信息的用户列表作为嵌入文档