azure-cosmosdb - Cosmos DB 查询投影
问题描述
我有以下格式的 Cosmos 文档:
(注:示例仅用于说明,实际文档具有不同的属性)
{
"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": {
}
.
.
.
}
OrderNumber
是一个分区键。
我正在尝试通过 Cosmos Query 投影上述文档,以将整个OrderDetails
JSON 对象和来自父级的一些属性放入一个带有过滤器的 JSON 中OrderDetails
-> 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": {
},
.
.
.
},
]
}
如上面的 JSON 所示,我在as中投影OrderNumber
和Version
属性。OrderDetails
Order
OrderDetails
是一个具有动态模式的海量 JSON,这使得我们很难单独投影其属性。
我已经尝试了一些选项来投影这个,但我能达到的最接近的是下面的查询:
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
and Version
in 作为单独的属性保留在Order
.
有什么办法可以做到这一点?
解决方案
您可以使用 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)
最后:new 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"
}
]
这符合您的要求吗?
推荐阅读
- prometheus - 将自定义属性添加到 Prometheus 指标中,例如地理位置
- wordpress - 如何在引导汉堡菜单中添加关闭按钮
- c# - 在 C# 中编组固定大小的枚举数组
- javascript - 我无法返回值(RXJS)
- reactjs - Reactjs:等待动画完成
- gitlab-omnibus - 首次安装时禁用 GitLab Letsencrypt 作为选项
- android - 通过模拟器的相机桌面
- javascript - 将年度列分解为每月的“javascript”条形图
- regex - 根据前缀使用 ansible 将属性附加到 EOL
- angular - Jasmine:Angular Typescript 项目中的“不完整:未找到规范”