【问题标题】:Querying nested objects in Cosmos DB在 Cosmos DB 中查询嵌套对象
【发布时间】:2021-12-14 12:58:31
【问题描述】:

我查看了许多答案并尝试了各种方法来查询我在 Cosmos DB 中拥有的嵌套对象。该数据库包含大量不同类型的 json 类型对象。我已经能够成功查询列表中第一个对象的子对象,但不能查询后续对象。

对象本身如下所示:

{
    "id": "d44c1ff6-d5b0-41b0-b84c-2a6c20f99ada",
    "deviceUID": "10203040501020304051-8",
    "time": "2021-10-27T12:49:53.1174041Z",
    "connectorId": 1,
    "meterValues": {
        "eairo": 1013363236,
        "cio": 4
    },
    "hash": "8ADAED5BBF663AAFE93644CA071573906CC409F70231105F10C5CEE5AE8FC341"
}

而我的连接和查询如下:

cnxn: pyodbc.Connection = pyodbc.connect(
"""DRIVER={CData ODBC Driver for Cosmos DB};
   AccountEndpoint=x;
   AccountKey=y;""")
df = pd.read_sql_query("SELECT m.id, m.deviceUID, m.time, m.meterValues.eairo FROM metering m WHERE m.deviceUID <> null", cnxn)

事实证明,SELECT 的 m.meterValues.eairo 部分存在问题。报错如下:

pandas.io.sql.DatabaseError: Execution failed on sql 'SELECT m.id, m.deviceUID, m.time, m.meterValues.eairo FROM metering m WHERE m.deviceUID <> null': ('HY000', "[HY000] No table found with the alias 'meterValues'. (-1) (SQLExecDirectW)")

知道我哪里可能出错了吗?

【问题讨论】:

  • 你不需要说FROM metering m - 只需说FROM m。除此之外:您应该尝试使用适用于 Cosmos DB 的本机 Python SDK,而不是 ODBC 库(请记住,Cosmos DB 不是本机关系数据库,它的 SQL 语法是您在关系数据库中找到的一个子集) .我怀疑你会得到更好的结果,因为你目前正试图将 Cosmos DB 强制转换为关系数据库接口。
  • 太好了,感谢 David,SDK 完成了这项工作。

标签: python azure azure-cosmosdb pyodbc azure-cosmosdb-sqlapi


【解决方案1】:

这要归功于 David,SDK 轻而易举地完成了这项工作。

编码如下:

from azure.cosmos import CosmosClient
import json

url = 'x'
key = 'y'
client = CosmosClient(url, credential=key)

database = client.get_database_client('z')
container = database.get_container_client('metering')

for item in container.query_items(
        query="SELECT m.id, m.deviceUID, m.time, m.meterValues.eairo FROM 
        metering m WHERE m.deviceUID <> null",
        enable_cross_partition_query=True):
    print(json.dumps(item, indent=True))

【讨论】:

    猜你喜欢
    • 2019-01-25
    • 2019-01-21
    • 2019-04-21
    • 1970-01-01
    • 2021-12-27
    • 2019-11-20
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多