繁体   English   中英

我可以在 Azure Cosmos DB 的复合索引中索引数组吗?

[英]Can I index an array in a composite index in Azure Cosmos DB?

我在索引 Azure Cosmos DB 中的数组时遇到问题

我正在尝试通过门户保存此索引策略

{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*"
        }
    ],
    "excludedPaths": [
        {
            "path": "/\"_etag\"/?"
        }
    ],
    "compositeIndexes": [
        [
            {
                "path": "/DeviceId",
                "order": "ascending"
            },
            {
                "path": "/TimeStamp",
                "order": "ascending"
            },
            {
                "path": "/Items/[]/Name/?",
                "order": "ascending"
            },
            {
                "path": "/Items/[]/DoubleValue/?",
                "order": "ascending"
            }
        ]
    ]
}

我收到错误“无法更新容器 DeviceEvents:消息:{“code”:“BadRequest”,“message”:“消息:{“Errors”:[“索引路径 '\/Items\/[]\/Name \/?' 无法接受,在 position '8' 附近失败。”

这似乎是给出错误的数组 [] 语法。

在旁注中,我不确定我所做的一切是否有意义,但我有一个看起来像这样的查询

SELECT SUM(de0["DoubleValue"])
FROM root JOIN de0 IN root["Items"]
WHERE root["ApplicationId"] = 57 AND root["DeviceId"] = 126 AND root["TimeStamp"] >= "2021-02-21T17:55:29.7389397Z" AND de0["Name"] = "Use Case"

其中 ApplicationId 是分区键,保存的项目如下所示

{
    "id": "59ab9323-26ca-436f-8d29-e1ddd826f025",
    "DeviceId": 3,
    "ApplicationId": 3,
    "RawData": "640F7A000A00E30142000000",
    "TimeStamp": "2021-02-20T18:36:52.833174Z",
    "Items": [
        {
            "Name": "Battery Status",
            "StringValue": "Full",
            "DoubleValue": null
        },
        {
            "Name": "Use Case",
            "StringValue": null,
            "DoubleValue": 12
        },
        {
            "Name": "Battery Voltage",
            "StringValue": null,
            "DoubleValue": 3.962
        },
        {
            "Name": "Rain Gauge Count",
            "StringValue": null,
            "DoubleValue": 10
        }
    ],
    "_rid": "CgdVAO7B0DNkAAAAAAAAAA==",
    "_self": "dbs/CgdVAA==/colls/CgdVAO7B0DM=/docs/CgdVAO7B0DNkAAAAAAAAAA==/",
    "_etag": "\"61008771-0000-0d00-0000-603156c50000\"",
    "_attachments": "attachments/",
    "_ts": 1613846213
}

我需要汇总数组中的一些这些项目,比如在温度上获取 MAX 或类似的东西(使用用例进行测试,尽管它没有意义)。 我推断,如果查询中的所有数据都在单个复合索引中,那么数据库将能够在不读取文档本身的情况下进行聚合。 但是我似乎根本无法添加包含数组的复合索引。

是的,复合索引不能包含数组路径。 它应该是一个标量值。

与包含或排除路径不同,您不能使用 /* 通配符创建路径。 每个复合路径都有一个隐含的 /? 在您不需要指定的路径的末尾。 复合路径导致一个标量值,这是复合索引中包含的唯一值。

参考: https://docs.microsoft.com/en-us/azure/cosmos-db/index-policy#composite-indexes

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM