我在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的汽车具有相同的散列。
答案 0 :(得分:1)
根据您的用例描述,根本不需要一些服务器端计算哈希。您可以使用car_name
和car_brand
的组合作为密钥,只要您想要使用哈希。例如,如果要按car_brand
和car_name
的“哈希”对汽车进行分组,请将其用作聚合中的分组键:
db.cars.aggregate([
{ "$group" : { "_id" : { "cn" : "$car_name", "cb" : "$car_brand" } }, ... }
...
])
请注意,根据car_name
和car_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
cn
和car_brand
cb
的汽车具有相同哈希值的汽车,请使用{{1}使用这些值:
find
您甚至可以在db.cars.find({ "car_name" : cn, "car_brand" : cb })
上添加一个唯一索引,以确保不会将与现有汽车具有相同“哈希”的汽车插入数据库。
在服务器端没有动态计算字段哈希的功能,并且在更新时将其保存到文档中 - 但我不确定您是否真的需要它。如果这样做,则必须在修改数据库时在客户端自行创建和更新哈希值。