我尝试使用:
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
相同的事情,但具有所有属性
我们通过添加用户定义函数解决了这个问题:
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。
虽然它对于直接映射到模型没有那么有用,但为了在浏览器中进行简单查询,我喜欢选择容器别名和我需要的任何其他列。
select c, 4 Type from c
输出如下数据:
{
"c": {
...
},
"Type": 4
}
我使用这种格式,特别是当我想以人类可读的格式查看
_ts
时。
select c, TimestampToDateTime(c._ts * 1000) AS sysTimestamp from c