【问题标题】:Dynamically computing a derived field when querying MongoDB查询 MongoDB 时动态计算派生字段
【发布时间】:2015-03-12 20:41:44
【问题描述】:

我的 MongoDB 中有一个字段,当我查询数据库时需要生成该字段。它是我数据库中其他一些字段的哈希值。我希望在数据库中动态生成该字段,因为这提供了两个好处:

  • 如果派生字段所依赖的字段之一被更新,那么我也不必重新更新哈希
  • 我不必在我的服务器上计算哈希

例如: 假设您在汽车表中有 5 个字段,汽车名称、汽车颜色、汽车购买日期、汽车品牌和汽车哈希。

我希望能够仅通过汽车名称和汽车品牌来判断两辆汽车是否相等,而不是汽车颜色。我希望在数据库上完成此操作,这样我的 Web 服务器就不必遍历所有记录并计算汽车哈希。为此,我希望在数据库中计算汽车哈希(哈希只是将汽车名称与汽车品牌连接起来的哈希)。我不想静态定义它,因为每当有人更改汽车名称时,我也必须更改汽车哈希。

我已经尝试过搜索,但我无法在 MongoDB 中找到执行此操作的方法。如果有人有任何建议,将不胜感激。

编辑:这里是数据库中的三个示例记录:

{ "id" = 1, "car_name": "LX200", "car_brand": "Honda", "car_colour": "Red", "car_purchased_on": "12/01/14" }
{ "id" = 2, "car_name": "Fusion", "car_brand": "Ford", "car_colour": "Blue", "car_purchased_on": "01/01/09" }
{ "id" = 3, "car_name": "LX200", "car_brand": "Honda", "car_colour": "Green", "car_purchased_on": "25/09/93" }

现在我想要一个查询来获取汽车列表,该列表按基于汽车的哈希值的最新汽车分组。这类似于:hash(car_name + car_brand)。

所以我的查询将返回两条记录:

{ "id" = 1, "car_name": "LX200", "car_brand": "Honda", "car_colour": "Red", "car_purchased_on": "12/01/14" }
{ "id" = 2, "car_name": "Fusion", "car_brand": "Ford", "car_colour": "Blue", "car_purchased_on": "01/01/09" }

因为 id = 3 的汽车与 id = 1 的汽车具有相同的哈希值。

【问题讨论】:

  • 如果您只是展示您的文档而不是制作几个实际上并没有解释任何内容的段落,这将是一个可以回答的问题。编辑您的问题以显示示例文档和预期结果。
  • 我已经编辑了我的问题以包含一个场景。

标签: mongodb mapreduce mongodb-query aggregation-framework


【解决方案1】:

根据您的用例描述,根本不需要一些服务器端计算哈希。您可以将car_namecar_brand 的组合用作要使用散列的任何位置的键。例如,如果您想通过 car_brandcar_name 的“哈希”对汽车进行分组,请将其用作聚合中的分组键:

db.cars.aggregate([
    { "$group" : { "_id" : { "cn" : "$car_name", "cb" : "$car_brand" } }, ... }
    ...
])

请注意,根据car_namecar_brand 的“哈希值”分组列出汽车并没有明确说明您对其他可能不同意的字段(例如car_colour)的含义。在您的示例中,假设您希望为每个组返回最近购买的汽车,因此管道如下所示:

db.cars.aggregate([
    { "$sort" : { "car_purchased_on" : -1 } },
    { "$group" : { "_id" : { "cn" : "$car_name", "cb" : "$car_brand" }, "car_colour" : { "$first" : "$car_colour" }, ... } }
])

如果您想测试是否存在与具有给定 car_name cncar_brand cb 的汽车具有相同哈希值的汽车,只需将 find 与这些值一起使用:

db.cars.find({ "car_name" : cn, "car_brand" : cb })

您甚至可以在 { "car_name" : 1, "car_brand" : -1 } 上放置一个唯一索引,以确保不会将与现有汽车具有相同“哈希”的汽车插入数据库中。

没有在服务器端动态计算字段哈希并在更新时将其保存到文档中的功能 - 但我不确定您是否真的需要它。如果这样做,您必须在修改数据库时自己在客户端中创建和更新哈希。

【讨论】:

  • 首先感谢您的回答。我希望在数据库上动态生成哈希。从理论上讲,我可以只传递我想要分组的所有字段而不生成哈希,但如果我的哈希依赖于 15 个以上的字段,它可能会变得很麻烦。我想知道是否有一种机制可以通过动态散列将数据库端的所有这些字段分组为一个字段,然后在我的查询中使用该字段而不是 15+ 个可能的字段进行分组。
  • 我认为答案已经说“没有在服务器端动态计算字段哈希的功能......”所以这就是你问题的答案 - 没有这样的机制。
猜你喜欢
  • 2013-08-24
  • 2022-12-08
  • 2016-10-22
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 2021-12-31
  • 2017-04-28
  • 1970-01-01
相关资源
最近更新 更多