【发布时间】:2019-08-05 15:27:44
【问题描述】:
我正在 Cosmos DB 中构建一个简单的事件存储,其中包含如下结构的文档:
{
"id": "e4c2bbd0-2885-4fb5-bcca-90436f79f155",
"entityType": "contact",
"history": [
{
"startDate": 1504656000,
"endDate": 1504656000,
"Name": "John"
},
{
"startDate": 1504828800,
"endDate": 1504828800,
"Name": "Jon"
}
]
}
这可能不是最有效的存储方式,但这是我开始的方式。但我希望能够在一段时间内从数据库中查询所有 contact 文档。 startDate 和 endDate 表示记录有效的时间。历史记录当前包含可能需要改进的记录的全部历史记录。
我尝试过创建这样的查询:
SELECT c.entityType, c.id,history.Name, history.startDate FROM c
JOIN history in c.history
where
c.entityType = "contact" AND
(history.StartDate <= 1504656001
AND history.EndDate >= 1504656001)
此查询应返回 2017 年 9 月 7 日的联系人状态,但它会返回所有历史记录。我玩过几个选项,但我不确定我错过了什么。
我也尝试过设置索引(也许这是问题所在?)所以我在这里包含了索引策略:
{
"indexingMode": "consistent",
"automatic": true,
"includedPaths": [
{
"path": "/*",
"indexes": [
{
"kind": "Range",
"dataType": "String",
"precision": -1
},
{
"kind": "Range",
"dataType": "Number",
"precision": -1
}
]
}
],
"excludedPaths": []
}
我错过了什么?索引是否正确?我的查询对于查询之间的日期是否正确?
【问题讨论】:
-
我最终将其保存为 unix 时间。
-
历史属性是未绑定列表吗?能长到很大吗?如果是这样,您可能会考虑将历史记录移动到具有不同
entityType的不同对象。请参阅this answer。 -
@MatiasQuaranta 未绑定列表的限制是什么?你是说我应该更好地规范化数据吗?我不确定该历史列表会增长到多大。我会说最多可能有 300-500 个实体。
-
未绑定列表的问题是您的文档大小会增长,使您的查询运行成本更高,如果两个作者想要将历史记录添加到同一个文档,您可能会遇到一些并发问题(除非您正在显式处理并发)。部分更新是not yet supported,所以问题是每次添加 1 个历史条目时都必须更新整个文档。
标签: azure azure-cosmosdb