我有以下格式的Cosmos文档:
(注意:示例仅用于说明,实际文档具有不同的属性)
import java.util.Comparator;;
import java.util.stream.Collectors;
Arrays.asList(files).stream()
.sorted(Comparator.comparing(File::getLastModified).reversed())
.collect(Collectors.toList());
{
"OrderNumer":"12345",
"Version":"5",
"OrderDetails": [
{
"id":1,
"OrderItem": {
"Name": "ABC",
"Description": "ABC Description",
.
.
.
},
"PaymentDetails": {
},
.
.
.
},
{
"id":2,
"OrderItem": {
"Name": "PQR",
"Description": "PQR Description",
.
.
.
},
"PaymentDetails": {
},
.
.
.
},
],
"OrderDate": "12-01-2020",
"CustomerDetails": {
}
.
.
.
}
是分区键。
我正在尝试通过Cosmos Query投影以上文档,以将整个OrderNumber
JSON对象和父级的一些属性转换为单个JSON,并在OrderDetails
-> { 1}}。
预期的预测应该是:
OrderDetails
如上面的JSON所示,我将id
中的{
"Order":
[
{
"OrderNumer":"12345",
"Version":"5",
"id":1,
"OrderItem": {
"Name": "ABC",
"Description": "ABC Description",
.
.
.
},
"PaymentDetails": {
},
.
.
.
},
{
"OrderNumer":"12345",
"Version":"5",
"id":2,
"OrderItem": {
"Name": "PQR",
"Description": "PQR Description",
.
.
.
},
"PaymentDetails": {
},
.
.
.
},
]
}
和OrderNumber
属性投影为Version
。
OrderDetails
是具有动态模式的大型JSON,这使我们难以单独投影其属性。
我尝试了一些方法来对此进行投影,但最接近的查询是在查询下方:
Order
但是,上述查询无法提供理想的结果,因为它将OrderDetails
和SELECT c.OrderNumber, c.Version, o as Order
FROM c
JOIN o in c.OrderDetails WHERE
c.OrderNumber= '1235' AND ARRAY_CONTAINS([1,2], o.id)
保留为OrderNumber
的单独属性。
有什么办法可以做到这一点?
答案 0 :(得分:2)
您可以使用UDF。
首先:创建一个udf,下面是代码
function Converted(version,orderNumber,orderItem){
orderItem.Version = version;
orderItem.OrderNumber = orderNumber;
return orderItem;
}
第二:使用此sql
select value udf.Converted(c.Version,c.OrderNumber,o) from c join o in c.OrderDetails WHERE c.OrderNumber= '12345' AND ARRAY_CONTAINS([1,2], o.id)
最后:新的JsonObject通过代码添加此结果。
这是结果:
[
{
"id": 1,
"OrderItem": {
"Name": "ABC",
"Description": "ABC Description"
},
"PaymentDetails": {},
"Version": "5",
"OrderNumber": "12345"
},
{
"id": 2,
"OrderItem": {
"Name": "PQR",
"Description": "PQR Description"
},
"PaymentDetails": {},
"Version": "5",
"OrderNumber": "12345"
}
]
这符合您的要求吗?
答案 1 :(得分:-1)
我知道现在回答这个问题为时已晚,直到现在您已经解决了问题,但仍在提供查询以帮助可能遇到类似问题的其他人。
CosmosDB提供了灵活性,可以帮助您修改输出JSON结构。有关上述问题,请参见以下查询。
查询:
SELECT
[
{
"OrderNumer": c.OrderNumer,
"Version": c.Version,
"id": od.id,
"OrderItem": {
"Name": od.OrderItem.Name,
"Description": od.OrderItem.Description
}
}
] AS Orders
FROM c
JOIN od IN c.OrderDetails
祝您编程愉快!