【问题标题】:Query CosmosDb Unstructured JSON查询 CosmosDb 非结构化 JSON
【发布时间】:2018-09-24 14:29:59
【问题描述】:

CosmosDB 如何查询动态 JSON 中的属性值?

该应用允许将 JSON 存储为对象的一组自定义属性。它们被序列化并存储在 CosmosDb 中。例如,这里有两个条目:

{
    "id": "ade9f2d6-fff6-4993-8473-a2af40f071f4",
    ...
    "Properties": {
        "fn": "Ernest",
        "ln": "Hemingway",
        "a_book": "The Old Man and the Sea"
    },
    ...
}

{
    "id": "23cb9d4c-da56-40ec-9fbe-7f5178a92a4f",
    ...
    "Properties": {
        "First Name": "Salvador",
        "Last Name": "Dali",
        "Period": "Surrealism"
    },
    ...
}

如何构造查询以便在 Properties 的值中进行搜索?

【问题讨论】:

  • 你说的是 C# LINQ 查询还是 SQL 查询?
  • 任何东西 :) 但我想 SQL 会是最好的,因为更多的人可以使用这个想法。
  • @Ovi 你好,我的回答对你有帮助吗?
  • @JayGong - 确实如此。最后我稍微修改了一下。刚刚发布为对您的回答的评论
  • @Ovi 感谢您的修改。我已经在我的回答中进行了总结。

标签: azure azure-sql-database azure-cosmosdb azure-cosmosdb-sqlapi


【解决方案1】:

我正在寻找不涉及名称的东西 子属性,例如 SELECT * FROM c WHERE some_function_here(c.Properties, ‘Ernest’)

也许我知道您想按Properties 的值而不是名称过滤文档。如果是这样,您可以在 cosmos db 中使用 UDF

udf 示例:

function query(Properties,filedValue){
    for(var k in Properties){  
        if(Properties[k] == filedValue)
            return true;  
    }
    return false;
}

示例查询:

SELECT  c.id FROM c where udf.query(c.Properties,'Ernest')

输出:


这里简单总结一下,Ovi的udf函数如下:

function QueryProperties (Properties, filedValue) {     
    for (var k in Properties) { 
        if (Properties[k] && Properties[k].toString().toUpperCase().includes(filedValue.toString().toUpperCase())) 
            return true;    
    return false; 
}

【讨论】:

  • 谢谢,我最终修改了一下,但这个想法很完美:function QueryProperties (Properties, filedValue) { for (var k in Properties) { if (Properties[k] && Properties[k].toString().toUpperCase().includes(filedValue.toString().toUpperCase())) return true; } return false; }
【解决方案2】:

以下两种语法都可以使用。

SELECT * FROM c where c.Properties["First Name"] = 'Salvador'

SELECT * FROM c where c.Properties.fn = 'Ernest'

【讨论】:

  • 这并不能完全解决尼克的问题。我正在寻找不涉及子属性名称的内容,例如SELECT * FROM c WHERE some_function_here(c.Properties, ‘Ernest’)
  • @Ovi 你的问题不清楚。 Jay 的 UDF 将解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
  • 2020-03-28
  • 1970-01-01
相关资源
最近更新 更多