如何编写查询所有数组条目的查询?

时间:2019-07-05 05:47:10

标签: azure-cosmosdb azure-cosmosdb-sqlapi

如何编写CosmosDB查询或SPR,使我可以在数组的所有条目中查找条目?每个数组条目都是一个复杂的数据类型,而不仅仅是一个简单的数组?

我尝试使用此查询:

SELECT DISTINCT c.locales[0].categories[0] AS topLevelCategory 
FROM c 
WHERE c.locales[0].country = 'SE'

问题是我无法保证c.loclales [0]始终为'SE',这有时是数组中的第二个或第三个条目,所以我不知道c.locales [X]应该代表X我需要的语言环境,例如,如果c.locales [0]是'SE',那么我就不会得到想要的匹配,因为'SE'恰好是c.locales [1]

如何克服此限制?我需要能够首先应用country ='SE'来获取正确的数组条目,然后再从该数组条目中获取类别。

我只是不知道该怎么办?

以下示例文档,预期输出为 任何输出格式中最简单的“ Herr”。

{
    "id": "0570eca0-8f16-4c85-a985-e3a271bcc6bc",
    "_id": "5b07c2bfbc7407000122e8b4",
    "artno": "0614460008",
    "vendor": "Acme",
    "updatedAt": "2019-06-25T18:50:33.167Z",
    "locales": [
        {
            "title": "Gestreiftes T-Shirt",
            "description": "Gestreiftes T-Shirt aus Baumwolljersey.",
            "categories": [
                "Herren",
                "Große Größen",
                "T-Shirts & Tanktops",
                "T-Shirt"
            ],
            "brand": null,
            "images": [
                ],
            "country": "DE",
            "currency": "EUR",
            "language": "de",
            "variants": [
                {
                    "artno": "0614460008005",
                    "urls": [

                    ],
                    "price": 9.99,
                    "stock": 1,
                    "attributes": {
                        "size": "XL",
                        "color": "Schwarz/Weiß gestreift"
                    }
                },
                {
                    "artno": "0614460008002",
                    "urls": [

                    ],
                    "price": 9.99,
                    "stock": 1,
                    "attributes": {
                        "size": "S",
                        "color": "Schwarz/Weiß gestreift"
                    }
                },
                {
                    "artno": "0614460008004",
                    "urls": [

                    ],
                    "price": 9.99,
                    "stock": 1,
                    "attributes": {
                        "size": "L",
                        "color": "Schwarz/Weiß gestreift"
                    }
                },
                {
                    "artno": "0614460008001",
                    "urls": [

                    ],
                    "price": 9.99,
                    "stock": 1,
                    "attributes": {
                        "size": "XS",
                        "color": "Schwarz/Weiß gestreift"
                    }
                },
                {
                    "artno": "0614460008006",
                    "urls": [

                    ],
                    "price": 9.99,
                    "stock": 1,
                    "attributes": {
                        "size": "XXL",
                        "color": "Schwarz/Weiß gestreift"
                    }
                },
                {
                    "artno": "0614460008003",
                    "urls": [

                    ],
                    "price": 9.99,
                    "stock": 1,
                    "attributes": {
                        "size": "M",
                        "color": "Schwarz/Weiß gestreift"
                    }
                }
            ]
        },
        {
            "title": "Striped T-shirt",
            "description": "Striped T-shirt in cotton jersey.",
            "categories": [
                "Men",
                "T-shirts & Vests",
                "Short Sleeve",
                "T-shirt"
            ],
            "brand": null,
            "images": [
                   ],
            "country": "UK",
            "currency": "GBP",
            "language": "en",
            "variants": [
                {
                    "artno": "0614460008006",
                    "urls": [
                        ],
                    "price": 8.99,
                    "stock": 1,
                    "attributes": {
                        "size": "XXL",
                        "color": "Black/White striped"
                    }
                },
                {
                    "artno": "0614460008005",
                    "urls": [

                    ],
                    "price": 8.99,
                    "stock": 1,
                    "attributes": {
                        "size": "XL",
                        "color": "Black/White striped"
                    }
                },
                {
                    "artno": "0614460008004",
                    "urls": [

                    ],
                    "price": 8.99,
                    "stock": 1,
                    "attributes": {
                        "size": "L",
                        "color": "Black/White striped"
                    }
                },
                {
                    "artno": "0614460008002",
                    "urls": [

                    ],
                    "price": 8.99,
                    "stock": 1,
                    "attributes": {
                        "size": "S",
                        "color": "Black/White striped"
                    }
                },
                {
                    "artno": "0614460008003",
                    "urls": [

                    ],
                    "price": 8.99,
                    "stock": 1,
                    "attributes": {
                        "size": "M",
                        "color": "Black/White striped"
                    }
                },
                {
                    "artno": "0614460008001",
                    "urls": [

                    ],
                    "price": 8.99,
                    "stock": 1,
                    "attributes": {
                        "size": "XS",
                        "color": "Black/White striped"
                    }
                }
            ]
        },
        {
            "title": "Randig t-shirt",
            "description": "En randig t-shirt i bomullstrikå.",
            "categories": [
                "Herr",
                "T-shirts & Linnen",
                "Kortärmat",
                "T-shirt"
            ],
            "brand": null,
            "images": [
                 ],
            "country": "SE",
            "currency": "SEK",
            "language": "sv",
            "variants": [
                {
                    "artno": "0614460008001",
                    "urls": [

                    ],
                    "price": 99,
                    "stock": 1,
                    "attributes": {
                        "size": "XS",
                        "color": "Svart/Vitrandig"
                    }
                },
                {
                    "artno": "0614460008001",
                    "urls": [

                    ],
                    "price": 99,
                    "stock": 1,
                    "attributes": {
                        "size": "XL",
                        "color": "Svart/Vitrandig"
                    }
                },
                {
                    "artno": "0614460008001",
                    "urls": [

                    ],
                    "price": 99,
                    "stock": 1,
                    "attributes": {
                        "size": "S",
                        "color": "Svart/Vitrandig"
                    }
                },
                {
                    "artno": "0614460008001",
                    "urls": [

                    ],
                    "price": 99,
                    "stock": 1,
                    "attributes": {
                        "size": "XXL",
                        "color": "Svart/Vitrandig"
                    }
                },
                {
                    "artno": "0614460008001",
                    "urls": [

                    ],
                    "price": 99,
                    "stock": 1,
                    "attributes": {
                        "size": "M",
                        "color": "Svart/Vitrandig"
                    }
                },
                {
                    "artno": "0614460008001",
                    "urls": [

                    ],
                    "price": 99,
                    "stock": 1,
                    "attributes": {
                        "size": "L",
                        "color": "Svart/Vitrandig"
                    }
                }
            ]
        },
        {
            "title": "Striped T-shirt",
            "description": "Striped T-shirt in cotton jersey.",
            "categories": [
                "Men",
                "T-shirts & Tank tops",
                "Short Sleeves",
                "T-shirt"
            ],
            "brand": null,
            "images": [
                  ],
            "country": "US",
            "currency": "USD",
            "language": "en",
            "variants": [
                {
                    "artno": "0614460008001",
                    "urls": [

                    ],
                    "price": 9.99,
                    "stock": 0,
                    "attributes": {
                        "size": "S",
                        "color": "Black/white striped"
                    }
                },
                {
                    "artno": "0614460008001",
                    "urls": [

                    ],
                    "price": 9.99,
                    "stock": 0,
                    "attributes": {
                        "size": "XL",
                        "color": "Black/white striped"
                    }
                },
                {
                    "artno": "0614460008001",
                    "urls": [

                    ],
                    "price": 9.99,
                    "stock": 0,
                    "attributes": {
                        "size": "M",
                        "color": "Black/white striped"
                    }
                },
                {
                    "artno": "0614460008001",
                    "urls": [

                    ],
                    "price": 9.99,
                    "stock": 0,
                    "attributes": {
                        "size": "L",
                        "color": "Black/white striped"
                    }
                },
                {
                    "artno": "0614460008001",
                    "urls": [

                    ],
                    "price": 9.99,
                    "stock": 0,
                    "attributes": {
                        "size": "XXL",
                        "color": "Black/white striped"
                    }
                },
                {
                    "artno": "0614460008001",
                    "urls": [

                    ],
                    "price": 9.99,
                    "stock": 1,
                    "attributes": {
                        "size": "XS",
                        "color": "Black/white striped"
                    }
                }
            ]
        }
    ],
    "relatedArtno": [
        "0614460001",
        "0614460002",
        "0614460005",
        "0614460006",
        "0614460007",
        "0614460011",
        "0614460012"
    ],
    "_rid": "QEwcAMCVWqgGAAAAAAAAAA==",
    "_self": "dbs/QEwcAA==/colls/QEwcAMCVWqg=/docs/QEwcAMCVWqgGAAAAAAAAAA==/",
    "_etag": "\"2e00f1ca-0000-0c00-0000-5d144d660000\"",
    "_attachments": "attachments/",
    "_ts": 1561611622
}

1 个答案:

答案 0 :(得分:0)

在您的SQL中使用Join

SELECT locales.categories[0] AS topLevelCategory 
FROM c 
join locales in c.locales
WHERE locales.country = 'SE'

输出:

enter image description here


更新答案:

两点。

一个,您的语言环境也是一个数组,因此您无法使用c.locales.categories访问类别。您需要使用c.locales[index].categories查询类别。

二,Array_contains具有第三个参数。如果要使用部分条件过滤数组,则需要将第三个参数添加为false。

ARRAY_CONTAINS(c.locales[index].categories[0], 'kids',true)

更多详细信息,请参阅document

enter image description here