查询时动态计算派生字段 MongoDB
Dynamically computing a derived field when querying MongoDB
我的 MongoDB 中有一个字段需要在查询数据库时生成。它是我数据库中其他一些字段的哈希值。我希望在数据库中动态生成该字段,因为这有两个好处:
- 如果派生字段所依赖的字段之一被更新,那么我也不必重新更新散列
- 我不必在我的服务器上计算哈希值
例如:
假设您在汽车中有 5 个字段 table、汽车名称、汽车颜色、汽车购买日期、汽车品牌和汽车哈希值。
我想仅通过汽车名称和汽车品牌来判断两辆车是否相同,而不是汽车颜色。我希望在数据库上完成此操作,这样我的网络服务器就不必遍历所有记录并计算汽车哈希值。为此,我希望在数据库中计算汽车散列值(散列值只是对汽车名称和汽车品牌进行散列)。我不想静态定义它,因为任何时候有人更改汽车名称,我也必须更改汽车哈希值。
我试过搜索,但在 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).
所以我的查询会 return 两条记录:
{ "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 的汽车具有相同的哈希值。
根据您的用例描述,根本不需要一些服务器端计算的哈希值。您可以将 car_name
和 car_brand
的组合用作要在任何地方使用哈希的键。例如,如果您想按 car_brand
和 car_name
中的 "hash" 对汽车进行分组,请将其用作聚合中的分组键:
db.cars.aggregate([
{ "$group" : { "_id" : { "cn" : "$car_name", "cb" : "$car_brand" } }, ... }
...
])
请注意,根据 car_name
和 car_brand
的 "hash value" 分组来列出汽车的定义不明确,而没有指定您对其他可能没有的字段的含义同意,喜欢 car_colour
。在您的示例中,大概您想要 return 每个组最近购买的汽车,因此管道看起来像:
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
的汽车具有相同的哈希值,只需使用 find
具有这些值:
db.cars.find({ "car_name" : cn, "car_brand" : cb })
您甚至可以在 { "car_name" : 1, "car_brand" : -1 }
上放置一个唯一索引,以确保不会将与现有汽车具有相同 "hash" 的汽车插入数据库。
没有在服务器端动态计算字段散列并在更新时将其保存到文档中的功能 - 但我不确定您是否真的需要它。如果这样做,您必须在修改数据库时在客户端中自己创建和更新散列。
我的 MongoDB 中有一个字段需要在查询数据库时生成。它是我数据库中其他一些字段的哈希值。我希望在数据库中动态生成该字段,因为这有两个好处:
- 如果派生字段所依赖的字段之一被更新,那么我也不必重新更新散列
- 我不必在我的服务器上计算哈希值
例如: 假设您在汽车中有 5 个字段 table、汽车名称、汽车颜色、汽车购买日期、汽车品牌和汽车哈希值。
我想仅通过汽车名称和汽车品牌来判断两辆车是否相同,而不是汽车颜色。我希望在数据库上完成此操作,这样我的网络服务器就不必遍历所有记录并计算汽车哈希值。为此,我希望在数据库中计算汽车散列值(散列值只是对汽车名称和汽车品牌进行散列)。我不想静态定义它,因为任何时候有人更改汽车名称,我也必须更改汽车哈希值。
我试过搜索,但在 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).
所以我的查询会 return 两条记录:
{ "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 的汽车具有相同的哈希值。
根据您的用例描述,根本不需要一些服务器端计算的哈希值。您可以将 car_name
和 car_brand
的组合用作要在任何地方使用哈希的键。例如,如果您想按 car_brand
和 car_name
中的 "hash" 对汽车进行分组,请将其用作聚合中的分组键:
db.cars.aggregate([
{ "$group" : { "_id" : { "cn" : "$car_name", "cb" : "$car_brand" } }, ... }
...
])
请注意,根据 car_name
和 car_brand
的 "hash value" 分组来列出汽车的定义不明确,而没有指定您对其他可能没有的字段的含义同意,喜欢 car_colour
。在您的示例中,大概您想要 return 每个组最近购买的汽车,因此管道看起来像:
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
的汽车具有相同的哈希值,只需使用 find
具有这些值:
db.cars.find({ "car_name" : cn, "car_brand" : cb })
您甚至可以在 { "car_name" : 1, "car_brand" : -1 }
上放置一个唯一索引,以确保不会将与现有汽车具有相同 "hash" 的汽车插入数据库。
没有在服务器端动态计算字段散列并在更新时将其保存到文档中的功能 - 但我不确定您是否真的需要它。如果这样做,您必须在修改数据库时在客户端中自己创建和更新散列。