首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何分两步查询Cosmos DB中的集合?

如何分两步查询Cosmos DB中的集合?
EN

Stack Overflow用户
提问于 2017-11-10 13:22:28
回答 1查看 2.5K关注 0票数 0

我在Cosmos DB中有一个集合,其中文档分为两种类型。我们叫他们boardpin

董事会:

代码语言:javascript
复制
{
  "id": "board-1",
  "description": "A collection of nice pins",
  "author": "user-a",
  "moments": [
    {
      "id": "pin-1"
    },
    {
      "id": "pin-2"
    },
    {
      "id": "pin-3"
    }
  ]
}

Pin:

代码语言:javascript
复制
{
  "id": "pin-1",
  "description": "Number 1 is the best pin",
  "author": "user-b"
}

我知道如何查询一个基于id的引脚板。但是我需要询问(基于董事会的id ),它给了我一个板中包含的所有引脚。如果我能过滤掉一个或多个部件的销钉,那也是很好的。

示例:不将作者返回给客户端。

代码语言:javascript
复制
{
  "id": "pin-1",
  "description": "Number 1 is the best pin"
},
{
  "id": "pin-2",
  "description": "Number 2 is very funny"
}..etc

我知道我可以通过发出两个请求在客户端应用程序中处理这个逻辑,但是是否可以为Cosmos DB编写一个处理这个问题的查询呢?

EN

回答 1

Stack Overflow用户

发布于 2017-11-28 21:32:04

简短回答:否,目前无法在单一sql查询中加入不同的文档.

DocumentDB是无模式的,没有像关系数据库世界中那样的“引用”的硬概念。文档中的引用in只是指向DocumentDB的常规字符串数据,它们的特殊含义(链接到其他文档)仅存在于应用程序中。查询目前只是通过一些给定的谓词查找文档或文档的一部分。它是在相互独立的文件上进行的。

作为一个侧面:我想象它是这样的设计,选择的限制,使并行的潜力,并可能有助于低延迟的梦想,他们打算交付。

这并不意味着你所需要的是不可能的。可供考虑的备选方案:

选项1:参考重新设计

如果您有一个数据设计,其中board-bin关系数据将存储在pin-side上,那么您可以使用单个查询查询board-1中的所有引脚,如下所示:

代码语言:javascript
复制
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:不更改任何

。。只需打两个电话。它很简单,而且从长远来看可能是最好的解决方案(考虑到设计、开发、维护、更改等的总体成本)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47223780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档