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-successfalse-success,但我们可以根据已有的成功字段创建它们。
    • success : true 变为 {"true-count": 1, "false-count": 0}
    • success : false 变为 {"true-count": 0, "false-count": 1}
      现在我们在每个文档中都有我们需要的那两个字段。
  • set 添加额外字段
  • groupcount真假成功
  • 将这 2 个字段设为数组并展开(以分隔不同文档中的字段)
  • project 修复结构

* 产生预期的输出,其中包含数据库中不存在的数据,就像您的示例一样。

Test code here

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