Join 通过对DocumentDb中的嵌套类应用联接来获取父记录

Join 通过对DocumentDb中的嵌套类应用联接来获取父记录,join,azure-cosmosdb,Join,Azure Cosmosdb,它省去了将所有查询加载到列表然后获取所需字段的工作,只需点击查询并直接获取字段。DocumentDB遵循NoSQL趋势,不支持跨文档联接。如果您现在拥有的解决方案无法满足您的需要,您可以在客户端手动实现连接,或者在DocumentDB中运行存储过程(存储过程)。在我自己的工作中,如果我可以通过两次往返来实现连接,我更喜欢客户端,因为它使用辅助存储,并且在加载的系统上具有更好的吞吐量。延迟是存储过程中的1.8倍,但吞吐量更好。如果需要2次以上的往返,则延迟太高,我倾向于使用存储过程。YMMV适合您

它省去了将所有查询加载到列表然后获取所需字段的工作,只需点击查询并直接获取字段。

DocumentDB遵循NoSQL趋势,不支持跨文档联接。如果您现在拥有的解决方案无法满足您的需要,您可以在客户端手动实现连接,或者在DocumentDB中运行存储过程(存储过程)。在我自己的工作中,如果我可以通过两次往返来实现连接,我更喜欢客户端,因为它使用辅助存储,并且在加载的系统上具有更好的吞吐量。延迟是存储过程中的1.8倍,但吞吐量更好。如果需要2次以上的往返,则延迟太高,我倾向于使用存储过程。YMMV适合您的情况,因此您可能需要自己运行一些实验。DocumentDB的好处在于,它提供了很多机会,可以根据您的情况进行优化,而不是假设连接将被执行。请注意,传统数据库中的连接功能使其更容易实现,并支持更快的开发,但这可能是一个性能问题,而且这些数据库没有提供像DocumentDB那样的灵活性,让您可以通过编码解决性能问题


从评论中更新。手工编码连接是一个大话题。在NoSQL中,经常会在手动连接的性能和消除连接或使其更快的非规范化之间进行权衡。连接的最简单算法包括两次往返。在您的例子中,RestaurantType看起来像是我所说的查找类型,其特征是一个小数字。在这种情况下,通常最好首先获取整个查找表(如果希望达到最佳效果,请将其缓存一段时间)。然后执行餐厅查询,并将查找值手工缝合到从该查询返回的表中。

谢谢回复@Larry,你知道我可以从哪里手工执行此类查询的来源吗?手工编写连接代码是一个大主题。在NoSQL中,经常会在手动连接的性能和消除连接或使其更快的非规范化之间进行权衡。连接的最简单算法包括两次往返。在您的例子中,RestaurantType看起来像是我所说的查找类型,其特征是一个小数字。在这种情况下,通常最好首先获取整个查找表(如果希望达到最佳效果,请将其缓存一段时间)。然后执行餐厅查询,并将查找值手工缝合到从该查询返回的表中。有意义吗?如前所述:)我手工缝合了这个查询,它成功了。谢谢你的帮助。酷,你能接受这个答案吗?我更新了它,在这个线程中包含了连接信息的手工编码。
 public class Restraunt
 {
 public string RestId {get; set;}
 public ICollection <RestrauntType> RType {get; set;}
 }

 public class RestrauntType
 {
 public string Opinion {get; set;}
 }
var sql = "SELECT * FROM Restraunt Join RType in Restraunt.RType Where        RType.Opinion = 'It works !' ";
var query = client.CreateDocumentQuery(documentCollection.SelfLink, sql).ToList();