CosmosDb 在子对象中查询

CosmosDb querying in sub-object

我正在尝试为我的 Azure CosmosDb 数据库中的特定用户查找具有“额外存储”高级包的帐户。这是我的 Account 对象的样子:

{
   "id": 123,
   "name": "My Account",
   "members": [
      {
         "id": 333,
         "name": "John Smith"
      },
      {
         "id": 555,
         "name": "Jane Doe"
      }
   ],
   "subscription": {
       "type": "great-value",
       "startDate": "2022-04-21T16:38:00.0000000Z",
       "premiumPackages": [
          {
             "type": "extra-storage",
             "status": "active"
          },
          {
             "type": "video-encoding",
             "status": "cancelled"
          }
       ]
   }
}

所以,我的查询条件(英文)是:

  1. 帐户必须包含“John Smith”(ID:333)作为成员
  2. 它必须在其 subscription
  3. 中包含“额外存储”高级包

我不确定我是否可以拥有多个 JOIN,但这是我到目前为止没有结果的尝试:

SELECT c.id, c.name, s.premiumPackages.status
FROM c JOIN m IN c.members
    JOIN s IN c.subscription
WHERE CONTAINS(m.id, 333)
    AND CONTAINS(s.premiumPackages.type, "extra-storage")

知道如何使用“John Smith”的“额外存储”包获取帐户吗?

此查询应该会为您提供所需的信息。

SELECT c.id, c.name, premiumPackages.status
FROM c
JOIN (SELECT VALUE m FROM m IN c.members WHERE m.id = 333)
JOIN (SELECT VALUE s FROM s IN c.subscription.premiumPackages WHERE s.type 
= "extra-storage") AS premiumPackages

Understanding how to query arrays in Azure Cosmos DB 上的这篇博客 post 有助于在尝试为数组编写查询时保留书签。

PS、Cosmos DB 根目录中的 id 必须是字符串,因此您的 "id": 123 应该是 "id": "123".