MongoDB 将一个字段值与另一个字段值的存在频率相加
MongoDB Sum the Frequency that a Field Value Exists with the Value of Another Field
我的数据库如下所示:
spider_results = [
{
"_id": {
"$oid": "345g435f543f"
},
"url": "localhost:8080/path1/",
"proxy": {
"proxy": "196.0.1.1:1500",
"protocol": "http",
},
"success": false,
},
{
"_id": {
"$oid": "14544gtf543f"
},
"url": "localhost:8080/path2/",
"proxy": {
"proxy": "196.0.1.1:1500",
"protocol": "http",
},
"success": true,
},
{
"_id": {
"$oid": "t4rw4rww4r"
},
"url": "localhost:8080/path3/",
"proxy": {
"proxy": "192.168.255.255:1500",
"protocol": "http",
},
"success": true,
},
{
"_id": {
"$oid": "ferfrw4456"
},
"url": "localhost:8080/path4/",
"proxy": {
"proxy": "192.168.255.255:1500",
"protocol": "http",
},
"success": true,
},
]
我的目标是计算每个代理 was/wasn 未“成功”的次数。结果如下:
196.0.1.1:1500 --> success:true = 1
196.0.1.1:1500 --> success:false = 1
192.168.255.255:1500 --> success:true = 2
192.168.255.255:1500 --> success:false = 0
我已经 运行 个人查询
{"proxy.proxy": "192.168.255.255:1500", success: true}
{"proxy.proxy": "192.168.255.255:1500", success: false}
但是随着代理数量的增加,这显然是不够的。我很有可能没有针对我的问题在谷歌上搜索正确的搜索查询,因为我还没有找到任何人在尝试相同类型的搜索。
查询
- 我们需要按代理分组并计算我们没有的 2 个字段
true-success
和 false-success
,但我们可以根据已有的成功字段创建它们。
success : true
变为 {"true-count": 1, "false-count": 0}
success : false
变为 {"true-count": 0, "false-count": 1}
现在我们在每个文档中都有我们需要的那两个字段。
set
添加额外字段
group
和count
真假成功
- 将这 2 个字段设为数组并展开(以分隔不同文档中的字段)
project
修复结构
* 产生预期的输出,其中包含数据库中不存在的数据,就像您的示例一样。
aggregate(
[{"$set":
{"success":
{"$cond":
["$success",
{"true-count": 1, "false-count": 0},
{"true-count": 0, "false-count": 1}]}}},
{"$group":
{"_id": "$proxy.proxy",
"true-count": {"$sum": "$success.true-count"},
"false-count": {"$sum": "$success.false-count"}}},
{"$set":
{"success":
[{"count": "$true-count", "success": true},
{"count": "$false-count", "success": false}]}},
{"$unwind": {"path": "$success"}},
{"$project":
{"_id": 0,
"proxy": "$_id",
"count": "$success.count",
"success": "$success.success"}}])
你可以这样试试:
db.collection.aggregate([
{
$group: {
_id: {
proxy: "$proxy.proxy",
success: "$success"
},
count: {
$sum: 1
}
}
}
])
这是此查询的结果:
[
{
"_id": {
"proxy": "196.0.1.1:1500",
"success": true
},
"count": 1
},
{
"_id": {
"proxy": "196.0.1.1:1500",
"success": false
},
"count": 1
},
{
"_id": {
"proxy": "192.168.255.255:1500",
"success": true
},
"count": 2
}
]
PS:这会计算数据库中每个代理的成功次数,如果该代理没有成功值,则不输出任何内容;例如这种情况不会输出 192.168.255.255:1500 --> success:false = 0
你可以试试here
我的数据库如下所示:
spider_results = [
{
"_id": {
"$oid": "345g435f543f"
},
"url": "localhost:8080/path1/",
"proxy": {
"proxy": "196.0.1.1:1500",
"protocol": "http",
},
"success": false,
},
{
"_id": {
"$oid": "14544gtf543f"
},
"url": "localhost:8080/path2/",
"proxy": {
"proxy": "196.0.1.1:1500",
"protocol": "http",
},
"success": true,
},
{
"_id": {
"$oid": "t4rw4rww4r"
},
"url": "localhost:8080/path3/",
"proxy": {
"proxy": "192.168.255.255:1500",
"protocol": "http",
},
"success": true,
},
{
"_id": {
"$oid": "ferfrw4456"
},
"url": "localhost:8080/path4/",
"proxy": {
"proxy": "192.168.255.255:1500",
"protocol": "http",
},
"success": true,
},
]
我的目标是计算每个代理 was/wasn 未“成功”的次数。结果如下:
196.0.1.1:1500 --> success:true = 1
196.0.1.1:1500 --> success:false = 1
192.168.255.255:1500 --> success:true = 2
192.168.255.255:1500 --> success:false = 0
我已经 运行 个人查询
{"proxy.proxy": "192.168.255.255:1500", success: true}
{"proxy.proxy": "192.168.255.255:1500", success: false}
但是随着代理数量的增加,这显然是不够的。我很有可能没有针对我的问题在谷歌上搜索正确的搜索查询,因为我还没有找到任何人在尝试相同类型的搜索。
查询
- 我们需要按代理分组并计算我们没有的 2 个字段
true-success
和false-success
,但我们可以根据已有的成功字段创建它们。success : true
变为 {"true-count": 1, "false-count": 0}success : false
变为 {"true-count": 0, "false-count": 1}
现在我们在每个文档中都有我们需要的那两个字段。
set
添加额外字段group
和count
真假成功- 将这 2 个字段设为数组并展开(以分隔不同文档中的字段)
project
修复结构
* 产生预期的输出,其中包含数据库中不存在的数据,就像您的示例一样。
aggregate(
[{"$set":
{"success":
{"$cond":
["$success",
{"true-count": 1, "false-count": 0},
{"true-count": 0, "false-count": 1}]}}},
{"$group":
{"_id": "$proxy.proxy",
"true-count": {"$sum": "$success.true-count"},
"false-count": {"$sum": "$success.false-count"}}},
{"$set":
{"success":
[{"count": "$true-count", "success": true},
{"count": "$false-count", "success": false}]}},
{"$unwind": {"path": "$success"}},
{"$project":
{"_id": 0,
"proxy": "$_id",
"count": "$success.count",
"success": "$success.success"}}])
你可以这样试试:
db.collection.aggregate([
{
$group: {
_id: {
proxy: "$proxy.proxy",
success: "$success"
},
count: {
$sum: 1
}
}
}
])
这是此查询的结果:
[
{
"_id": {
"proxy": "196.0.1.1:1500",
"success": true
},
"count": 1
},
{
"_id": {
"proxy": "196.0.1.1:1500",
"success": false
},
"count": 1
},
{
"_id": {
"proxy": "192.168.255.255:1500",
"success": true
},
"count": 2
}
]
PS:这会计算数据库中每个代理的成功次数,如果该代理没有成功值,则不输出任何内容;例如这种情况不会输出 192.168.255.255:1500 --> success:false = 0
你可以试试here