如何选择文档的所有字段和新属性

问题描述 投票:0回答:2

我尝试使用:

select *, 4 Type from c
向查询的投影添加新属性,但失败并出现错误
Syntax error, incorrect syntax near ','
。尝试
select c.*, 4 Type from c
会导致类似的错误:
Syntax error, incorrect syntax near '*'.

手动投影所有属性并不是真正的选择,因为并非所有文档都包含所有属性(DocumentDb 的最佳功能之一)。

我该怎么做?

更新

我想要完成的事情在任何 SQL Like 语言中都是非常简单的。打开您选择的任何关系数据库并执行

select *, 4 Type from [Table]
,结果非常简单:一个包含所有列及其相应值的表,加上一个名为
Type
的附加列,其中所有行都具有相同的值:
4
。这里的区别在于,在具有模式的关系数据库中,数据库中的所有行都包含相同的列,因此很容易枚举列而不是要求
*
。在像 documentdb 这样的无模式环境中,您无法枚举它们,因为可能存在无限的组合。

我正在尝试完成与

select c.id, 4 Type from c
相同的事情,但具有所有属性

azure-cosmosdb
2个回答
0
投票

我们通过添加用户定义函数解决了这个问题:

function AddType (c, v) { 
   c['Type'] = v;
   return c;
}

并称其为

SELECT value udf.AddType(c,4) FROM c

当然,您可以通过传入数组来使其更加通用,但希望 Cosmos Db 团队能够为其添加本机支持。

警告

此函数增加了开销,在我们的内部测试中,它使 RU 增加了一倍多。

select * from c
使用上述函数得到 90 RU 与 220 RU。


0
投票

虽然它对于直接映射到模型没有那么有用,但为了在浏览器中进行简单查询,我喜欢选择容器别名和我需要的任何其他列。

select c, 4 Type from c

输出如下数据:

{
    "c": {
        ...
    },
    "Type": 4
}

我使用这种格式,特别是当我想以人类可读的格式查看

_ts
时。

select c, TimestampToDateTime(c._ts * 1000) AS sysTimestamp from c

© www.soinside.com 2019 - 2024. All rights reserved.