我正在用node.js开发一个API,该API查询Mongo数据库,而我在复杂的模式定义方面遇到了麻烦,我希望我的查询返回一个可能具有预先计算的字段的文档。
上下文:产品在商店中有存货,该存货由几个计数器定义:实物(简单:例如,商店中的存货)和虚拟商品(这是计算的结果,例如可用于库存的存货)销售)
API应该返回产品的每个计数器的值:
{
"product_code": "123456",
"counters": [
{
"code": "1",
"label": "Stock 1",
"value": 42
},
{
"code": "2",
"label": "Stock 2",
"value": 1337
},
{
"code": "50",
"label": "Available for sale",
"value": 1295 // <= result of $2 - $1
}
]
}
因此,我制定了3个模式(不确定):
库存:
{
"product": "123456",
"1": 42,
"2": 1337
}
物理计数器:
{
"code": "1",
"label": "Stock 1"
}
虚拟柜台:
{
"code": "50",
"label": "Available for sale",
"calculation": [
{
"counter": "1",
"operation": "-"
},
{
"counter": "2",
"operation": "+"
}
}
问题:我担心的是虚拟计数器,其计算结果可以更改,所以要么:
我将它们存储在一个不同的集合中(按原样),并在每次调用(性能问题)时在我的API中进行计算
我将它们存储在不同的集合中,并在视图中进行计算(使用mongo缓存可能会提高性能,但仍会在每次调用时进行计算)
我会预先计算该值并将其仅存储在一个集合中,但是如果计算发生变化该怎么办?我必须批量更新所有文档(如果有两个并行更新,可能会导致不一致)
作为Mongo的新手,我没有找到其他解决方案,也不知道这三个之间最好的解决方案是什么。假设我的Mongo模式应该正是我的API返回的内容,那么这些都不适合。
由于我的API是由公共网站调用的,因此请求的执行确实很重要。
您的建议是什么?