查询MongoDB时动态计算派生字段

时间:2015-01-14 15:39:46

标签: mongodb mapreduce mongodb-query aggregation-framework

我在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的汽车具有相同的散列。

1 个答案:

答案 0 :(得分: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的汽车具有相同哈希值的汽车,请使用{{1}使用这些值:

find

您甚至可以在db.cars.find({ "car_name" : cn, "car_brand" : cb }) 上添加一个唯一索引,以确保不会将与现有汽车具有相同“哈希”的汽车插入数据库。

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