Azure cosmosdb Cosmos db联接会产生重复的结果

Azure cosmosdb Cosmos db联接会产生重复的结果,azure-cosmosdb,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 &g

给定这样的文档结构:

{
  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"

这将产生重复的结果。有没有办法编写此查询,使其只返回不同的父项?

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

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

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


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

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

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


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

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

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

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

为什么不在sql中使用
distinct
关键字来消除重复记录呢?它由宇宙数据库支持

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

希望对你有帮助


更新答案:

我在JavaSDK中测试了
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)); 
        }
String collectionLink=String.format(“/dbs/%s/colls/%s”,“db”,“coll”);
SqlQuerySpec SqlQuerySpec=新的SqlQuerySpec();
sqlQuerySpec.setQueryText(“从c中选择不同的c.name”);
FeedResponse queryResults=documentClient.queryDocuments(
收集链接,
sqlQuerySpec,查询选项);
System.out.println(“运行SQL查询…”);
对于(文档:queryResults.getQueryInterable()){
System.out.println(String.format(“\tRead%s”,document));
}

我的Sdk版本是:
1.16.2
(最新)

为什么不在sql中使用
distinct
关键字来消除重复记录?它由宇宙数据库支持

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

希望对你有帮助


更新答案:

我在JavaSDK中测试了
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)); 
        }
String collectionLink=String.format(“/dbs/%s/colls/%s”,“db”,“coll”);
SqlQuerySpec SqlQuerySpec=新的SqlQuerySpec();
sqlQuerySpec.setQueryText(“从c中选择不同的c.name”);
FeedResponse queryResults=documentClient.queryDocuments(
收集链接,
sqlQuerySpec,查询选项);
System.out.println(“运行SQL查询…”);
对于(文档:queryResults.getQueryInterable()){
System.out.println(String.format(“\tRead%s”,document));
}

我的Sdk版本是:
1.16.2
(最新版本)

我知道这是预期的行为,只是找不到正确的方法。就我所见,数组_CONTAINS不允许进行“大于”的比较。您是否有一个示例查询可以给出正确的annswer?谢谢,但这还不够好。查询日期可能是2015年6月6日,然后我需要生成太多的ARRAY_CONTAINS语句。似乎实现这一点的唯一方法是在代码中执行不同的过滤。这不是我所希望的,但似乎是唯一的方法。我知道这是预期的行为,我就是找不到正确的方法。就我所见,数组_CONTAINS不允许进行“大于”的比较。您是否有一个示例查询可以给出正确的annswer?谢谢,但这还不够好。查询日期可能是2015年6月6日,然后我需要生成太多的ARRAY_CONTAINS语句。似乎实现这一点的唯一方法是在代码中执行不同的过滤。这不是我所希望的,但似乎是唯一的方法。如果目的是按子日期晚于某个日期的文档进行筛选,则使用EXISTS和子查询比选择联接然后使用DISTINCT删除重复项更有效。当我在门户查询资源管理器中运行此操作时,效果很好。但与“Exists”一样,sdk似乎不支持它,它给了我一个例外。@Zaphod嗨,我认为没有必要使用Exists。只要在你的问题中使用distinct。关于你的情况,distinct没有任何进一步的要求吗?请告诉我。谢谢。我在尝试distinct时没有使用Exists。它给出的结果与我尝试退出时的结果相同。它们都不起作用。我使用SqlQuerySpec对象,您的查询(仅具有不同的)并给出异常。它在查询资源管理器中运行良好,但在代码中不起作用。@Zaphod Hi,请查看我的更新答案。我在JavaSDK中进行了测试,效果很好。我们之间有什么不同。您是否尝试过最新的sdk?如果目的是按子日期晚于某个日期的文档进行筛选,则使用EXISTS和子查询比选择联接然后使用DISTINCT删除重复项更有效。当我在门户查询资源管理器中运行此功能时,效果很好。但与“Exists”一样,sdk似乎不支持它,它给了我一个例外。@Zaphod嗨,我认为没有必要使用Exists。只要在你的问题中使用distinct。关于你的情况,distinct没有任何进一步的要求吗?请告诉我。谢谢。我在尝试distinct时没有使用Exists。它给出的结果与我尝试退出时的结果相同。它们都不起作用。我使用一个SqlQuerySpec对象,您的查询(带有