【问题标题】: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 请注意,我正在尝试对唯一句子进行字数统计,而不是对唯一句子进行唯一字数统计

标签: database mongodb mongoose mongodb-query nosql


【解决方案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
猜你喜欢
  • 2020-05-31
  • 1970-01-01
  • 2022-11-16
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多