使用DocumentDb加入多个孩子

时间:2015-09-11 15:46:17

标签: azure-cosmosdb

我正在尝试在DocumentDb上运行以下查询

SELECT p.id 
FROM p JOIN filter IN p.Filters
WHERE filter.Id = "686e4c9c-f1ab-40ce-8472-cc5d63597263" 
AND filter.Id = "caa2c2a0-cc5b-42e3-9943-dcda776bdc20"

我的json是这样的

 {
    "id": "a3dc570b-26e2-40a9-8777-683186965f78",
    "Filters": [
      {
        "Id": "686e4c9c-f1ab-40ce-8472-cc5d63597263"
      },
      {
        "Id": "caa2c2a0-cc5b-42e3-9943-dcda776bdc20"
      }
    ]
}

我想找到具有ID为“686e4c9c-f1ab-40ce-8472-cc5d63597263”的子过滤器的实体和具有Id“Id”的子过滤器:“caa2c2a0-cc5b-42e3-9943-dcda776bdc20”,但是查询不返回任何结果。

如果我使用OR而不是AND我可以得到结果,但这显然不是我想要的结果。

1 个答案:

答案 0 :(得分:0)

要查询单个父级中的多个子级,您可以使用多个JOINS

注意:由于必须执行多个交叉产品,这可能会成为一项昂贵的查询。

SELECT p.id
FROM p
JOIN filter1 IN p.Filters
JOIN filter2 IN p.Filters
WHERE filter1.Id = "686e4c9c-f1ab-40ce-8472-cc5d63597263"
  AND filter2.Id = "caa2c2a0-cc5b-42e3-9943-dcda776bdc20"

对于子项顺序具有确定性的情况 - 您可以通过在查询中使用子元素的索引来避免执行交叉积(JOIN)。这将是更快,更便宜的查询:

SELECT p.id
FROM p
WHERE p.Filters[0].Id = "686e4c9c-f1ab-40ce-8472-cc5d63597263"
  AND p.Filters[1].Id = "caa2c2a0-cc5b-42e3-9943-dcda776bdc20"