Cosmos db联接给出重复的结果

时间:2018-08-15 08:51:43

标签: azure-cosmosdb

给出这样的文档结构:

{
  Id: "1",
  Title:"One",
  Children: [
    {Id:"A", Date:"01-01-2015"},
    {Id:"B", Date:"01-01-2016"},
  ]
}

我想获取所有子日期晚于“ 01-01-2014”的文档。我尝试过的查询是:

SELECT parent.id, parent.Title
FROM parent 
JOIN child IN parent.Children
child.Date >= "01-01-2014"

这将给出重复的结果。有什么办法可以编写此查询,使其只返回不同的父母?

3 个答案:

答案 0 :(得分:2)

您可以使用EXISTS表达式对子查询中的数组项进行比较。 尝试以下查询:

SELECT parent.id, parent.Title
FROM parent
WHERE EXISTS(SELECT VALUE child FROM child IN parent.Children WHERE child.Date >= "01-01-2014")

答案 1 :(得分:2)

为什么不只在sql中使用distinct关键字来消除重复记录? cosmos db支持。

SELECT distinct parent.id, parent.Title
FROM parent 
JOIN child IN parent.Children
where child.Date >= "01-01-2014"

enter image description here

希望它对您有帮助。


更新答案:

我在java sdk中测试了SqlQuerySpec,它工作正常。

        String collectionLink = String.format("/dbs/%s/colls/%s", "db", "coll");

        SqlQuerySpec sqlQuerySpec = new SqlQuerySpec();
        sqlQuerySpec.setQueryText("select distinct c.name from c");

        FeedResponse<Document> queryResults = documentClient.queryDocuments(
                collectionLink,
                sqlQuerySpec, queryOptions);

        System.out.println("Running SQL query...");
        for (Document document : queryResults.getQueryIterable()) {
            System.out.println(String.format("\tRead %s", document)); 
        }

我的SDK版本为:1.16.2(最新)

答案 2 :(得分:1)

基本上,重复记录是上述投影中的预期行为,因为对于联接而言,每个条件都满足每个父+子[0]和父+子[1]。

如果只需要检索唯一的一个,则必须在Childrens列表中使用ARRAY_CONTAINS

但是,无法为数组项提供条件,因此您必须对日期值进行硬编码(我知道这是不理想的,只能用作最后的手段),并使用部分匹配(将last param设置为true ):

SELECT parent.id, parent.Title
FROM parent WHERE
    ARRAY_CONTAINS(parent.Childred, {"Date": "2014"}, true) OR 
    ARRAY_CONTAINS(parent.Childred, {"Date": "2015"}, true) OR
    ARRAY_CONTAINS(parent.Childred, {"Date": "2016"}, true) OR 
    ARRAY_CONTAINS(parent.Childred, {"Date": "2017"}, true) OR 
    ARRAY_CONTAINS(parent.Childred, {"Date": "2018"}, true)