【问题标题】:Getting duplicate records in select query for the Azure DocumentDB在 Azure DocumentDB 的选择查询中获取重复记录
【发布时间】:2017-02-10 07:01:30
【问题描述】:

我需要为 Azure DatabaseDB 中的以下 JSON 数据编写一个 Select 查询。

{
  "Result": [
    {
      "media": [
        {
          "url": "https://someurl.com",
          "thumb_url": "https://someurl.com",
          "id": "f545f874-a9b4-4573-a0b0-b2d50a7994e0",
          "removed": false,
          "size": 133454,
          "length": 0,
          "type": "IMG",
          "avail": true,
          "has_thumb": true,
          "tagged_chi": [
            {
              "chi_id": "1069b9ef-1028-45f4-b9a1-a40e0d438f4e",
              "tag_x": 262.048,
              "tag_y": 157.472,
              "tag_by": "d481a522-6e2f-4dc6-8aeb-bc87cf27287d",
              "created": 1486723018,
              "last_updated": 1486723018
            },
            {
              "chi_id": "7102fc10-62e8-4d0a-9fcf-35645253fcef",
              "tag_x": 231.648,
              "tag_y": 146.528,
              "tag_by": "d481a522-6e2f-4dc6-8aeb-bc87cf27287d",
              "created": 1486723018,
              "last_updated": 1486723018
            }
          ],
          "created": 1486723012,
          "last_updated": 1486723017
        }
      ],
      "id": "23bcd070-0f64-4914-8bc1-d5e936552295",
      "acc_id": "d481a522-6e2f-4dc6-8aeb-bc87cf27287d",
      "chi_id": "7102fc10-62e8-4d0a-9fcf-35645253fcef",
      "is_note": false,
      "title": "",
      "when": -2147483648,
      "loc_id": null,
      "col_id": null,
      "comment": null,
      "removed": false,
      "created": -2147483648,
      "last_updated": -2147483648,
      "note_type": null,
      "note_value": null
    },
    {
      "media": [
        {
          "url": "https://someurl.com",
          "thumb_url": "https://someurl.com",
          "id": "7665b921-2790-496b-a70f-30afae43d8c6",
          "removed": false,
          "size": 6872977,
          "length": 0,
          "type": "IMG",
          "avail": true,
          "has_thumb": true,
          "tagged_chi": [
            {
              "chi_id": "1069b9ef-1028-45f4-b9a1-a40e0d438f4e",
              "tag_x": 2305.152,
              "tag_y": 686.5653,
              "tag_by": "d481a522-6e2f-4dc6-8aeb-bc87cf27287d",
              "created": 1486976119,
              "last_updated": 1486976119
            },
            {
              "chi_id": "7102fc10-62e8-4d0a-9fcf-35645253fcef",
              "tag_x": 1070.757,
              "tag_y": 1038.741,
              "tag_by": "d481a522-6e2f-4dc6-8aeb-bc87cf27287d",
              "created": 1486976119,
              "last_updated": 1486976119
            }
          ],
          "created": 1486976100,
          "last_updated": 1486976118
        }
      ],
      "id": "58fa3c58-5508-4371-83f4-405332c636e1",
      "acc_id": "d481a522-6e2f-4dc6-8aeb-bc87cf27287d",
      "chi_id": "7102fc10-62e8-4d0a-9fcf-35645253fcef",
      "is_note": false,
      "title": "",
      "when": -2147483648,
      "loc_id": null,
      "col_id": null,
      "comment": null,
      "removed": false,
      "created": -2147483648,
      "last_updated": -2147483648,
      "note_type": null,
      "note_value": null
    }
  ],
  "Continuation": null
}

我正在尝试类似下面的方法,但它不适合我。我希望数据匹配到Media => tagged_chil => id

@peter-tirrell 建议的查询:

string.Format("select c.id, c.acc_id, c.chi_id, c.is_note, c.title, c.loc_id, c.media, t from c JOIN m IN c.media JOIN t IN m.tagged_chi where c.chi_id = '{0}' OR t.chi_id = '{0}'", childId)

@peter-tirrell 查询的细微变化:

string.Format("select c.id, c.acc_id, c.chi_id, c.is_note, c.title, c.loc_id, c.media, t from c JOIN m IN c.media JOIN t IN m.tagged_chi where c.chi_id = '{0}' OR ( t.chi_id != c.chi_id AND t.chi_id = '{0}')", childId)

如果 c.child 和 t.child 的值相同,我会得到重复的记录。

【问题讨论】:

  • 你能检查响应头,看看是否返回了继续令牌?
  • 我收到了[] 作为回复。
  • 在第二次出现时尝试使用转义双引号,这样您就可以使用...{"id": '{0}'}... 而不是...{"id": \"{0}\"}...。我的工作理论是,它对该部分使用 JSON 解析,因为您将其包装在花括号中以使其成为对象,并且 JSON 需要双引号,即使 SQL 可以使用双引号或单引号。如果解决了问题,我将作为答案发布,您可以接受。
  • 它与引号无关,因为其他查询正在工作(没有数组;))

标签: azure select azure-cosmosdb nosql


【解决方案1】:

您可能会使用JOINs 来展平结构,这也可能有助于查询。比如:

select 
c.id,
c.acc_id,
c.chi_id,
c.is_note,
c.title,
c.loc_id,
m,
t
from c JOIN m IN c.media
JOIN t IN m.tagged_chi
where c.chi_id = {0} OR t.id = {0}

然后您可以选择您需要的任何特定数据字段。

【讨论】:

  • 它对我有用,但不是 100% 如果c.chi_id = {0} OR t.id = {0} 两者相同,我会得到重复记录。
  • 我在这里找到了一些解决方案 (stackoverflow.com/a/33373782/4025613),但我不知道如何使用这些解决方案。
  • 是的,对于任何类型的聚合类型功能,我一直在我的客户端代码中实现它;我将执行上面的查询,然后处理结果,在我的处理端处理重复或类似的事情。
  • 找到解决方案后请在此处发布:)
【解决方案2】:

根据我的经验,您的查询代码将返回 null。因为ARRAY_CONTAINS 它将返回一个布尔值,指示数组是否包含指定的值。这意味着您的查询代码可以短为 SELECT * FROM TimelineEvent t WHERE OR ARRAY_CONTAINS ( t.media, true) 在您的情况下将返回 null。

请尝试使用以下代码:

SELECT * FROM TimelineEvent t WHERE  ARRAY_CONTAINS ( t.media[0].tagged_chi, {  
               "id":"0af23202-07f9-40a0-90ba-d2e2f6679331"
             }) 

我们也可以使用UDFs通过自定义代码来实现它,关于UDF的更多细节,请参考document

【讨论】:

  • 对不起,但这对我不起作用。让我检查一下上面的文档链接。
  • 我已将答案中的代码更新为SELECT * FROM TimelineEvent t WHERE ARRAY_CONTAINS ( t.media[0].tagged_chi, { "id":"0af23202-07f9-40a0-90ba-d2e2f6679331" })
  • 我们可以从official document获取多个代码示例
  • 抱歉,我没有收到您的信息,如果我在 Media 中有多个项目怎么办?
猜你喜欢
  • 1970-01-01
  • 2021-05-16
  • 2011-10-23
  • 2017-08-01
  • 2019-06-10
  • 2014-11-19
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多