给出这样的文档结构:
{
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 :(得分: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"
希望它对您有帮助。
更新答案:
我在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)