我在Cosmos DB中有一个集合,其中文档分为两种类型。我们叫他们board和pin。
董事会:
{
"id": "board-1",
"description": "A collection of nice pins",
"author": "user-a",
"moments": [
{
"id": "pin-1"
},
{
"id": "pin-2"
},
{
"id": "pin-3"
}
]
}Pin:
{
"id": "pin-1",
"description": "Number 1 is the best pin",
"author": "user-b"
}我知道如何查询一个基于id的引脚板。但是我需要询问(基于董事会的id ),它给了我一个板中包含的所有引脚。如果我能过滤掉一个或多个部件的销钉,那也是很好的。
示例:不将作者返回给客户端。
{
"id": "pin-1",
"description": "Number 1 is the best pin"
},
{
"id": "pin-2",
"description": "Number 2 is very funny"
}..etc我知道我可以通过发出两个请求在客户端应用程序中处理这个逻辑,但是是否可以为Cosmos DB编写一个处理这个问题的查询呢?
发布于 2017-11-28 21:32:04
简短回答:否,目前无法在单一sql查询中加入不同的文档.
DocumentDB是无模式的,没有像关系数据库世界中那样的“引用”的硬概念。文档中的引用in只是指向DocumentDB的常规字符串数据,它们的特殊含义(链接到其他文档)仅存在于应用程序中。查询目前只是通过一些给定的谓词查找文档或文档的一部分。它是在相互独立的文件上进行的。
作为一个侧面:我想象它是这样的设计,选择的限制,使并行的潜力,并可能有助于低延迟的梦想,他们打算交付。
这并不意味着你所需要的是不可能的。可供考虑的备选方案:
选项1:参考重新设计
如果您有一个数据设计,其中board-bin关系数据将存储在pin-side上,那么您可以使用单个查询查询board-1中的所有引脚,如下所示:
select * from pin where pin.boardId = @boardId为了优化RU的使用,通常需要在某种程度上去还原数据模型。有时,将某些父信息复制到引用文档是有益的。或者,如果数据不太不稳定,并且从双方读取了大量数据,甚至可以将关系存储在两端。作为一个缺点,在写操作中保持数据同步变得更加复杂。嗯,权衡..。
如果重新设计是一种选择,那么请参阅talk 由Ryan CrawCour和David为//build/2016的NoSQL文档数据库建模数据。它应该给你一些想法来考虑。
在为documentdB设计数据时,请记住,在DocumentDB存储中相对便宜,处理能力(RU)是您需要支付的。
选项2:存储过程
如果您希望/需要优化存储/延迟,并且不能修改数据设计,并且真的需要在单次往返中执行这样的查询,那么您可以构建一个存储过程来在服务器端执行查询,然后将结果打包到DocumentDB中单个返回的Json消息中。
有关可以做什么和如何做的更多细节,请参见Azure Cosmos DB服务器端编程:存储过程、数据库触发器和UDF。
我猜想您可能会得到稍微更好的延迟(由于单个调用)和稍差的总体RU使用( SP执行、事务处理、合并结果的额外工作),但肯定会在开始之前测试您的情况。
我认为这个选项有点脏,因为: 1.根据更高层次的需求组合文档是逻辑的,因此不应该在数据库中实现,而应该在应用程序逻辑层中实现。1. DocumentDB中的JS在开发、调试和维护方面比较麻烦。
选项3:不更改任何
。。只需打两个电话。它很简单,而且从长远来看可能是最好的解决方案(考虑到设计、开发、维护、更改等的总体成本)。
https://stackoverflow.com/questions/47223780
复制相似问题