我将数据存储在 Cosmos 数据库中,它看起来类似于下面所示的示例。我需要编写一个查询,该查询将在“有效负载”部分中查找以查看值是否存在。无法使用密钥(例如“lastModifiedOn.previousValue”),因为它们是动态创建的。
{
"externalId": null,
"serviceName": "Test.Api",
"payload": {
"enabled.previousValue": "False",
"enabled.currentValue": "True",
"lastModifiedOn.previousValue": "2024-04-15 11:24:28",
"lastModifiedOn.currentValue": "2024-04-15 11:24:28"
},
"actionType": "Modified"
}
我使用了以下查询,但未能找到任何记录。我希望它能找到所提供的日期时间作为有效负载部分中的值存在的记录。
SELECT VALUE root FROM root WHERE (ARRAY_CONTAINS(root["payload"]["values"], "2024-04-15 11:24:28") )
我想做的事情可能吗?
需要 Cosmos 查询来按值查找记录而不需要键
可以通过在 Azure Cosmos DB 中使用
UDF
来按值查找记录而不使用其键。下面是不使用密钥搜索文档的 UDF。在 UDF x
中使用查询中提供的值进行搜索并成功提供所需的输出,如下所示。
SELECT * FROM c
WHERE udf.findValueInDocument(c, "2024-04-15 11:24:28")
UDF:
function findValueInDocument(doc, x) {
for (let key in doc) {
if (typeof doc[key] === 'object' && doc[key] !== null) {
const result = findValueInDocument(doc[key], x);
if (result) {
return true;
}
} else if (doc[key] === x) {
return true;
}
}
return false;
}
输出:
[
{
"externalId": null,
"serviceName": "Test.Api",
"payload": {
"enabled.previousValue": "False",
"enabled.currentValue": "True",
"lastModifiedOn.previousValue": "2024-04-15 11:24:28",
"lastModifiedOn.currentValue": "2024-04-15 11:24:28"
},
"actionType": "Modified"
}
]