如何处理 CosmosDB 中类似 OUTER JOIN 的功能?

How to handle OUTER JOIN like functionality in CosmosDB?

我有一个使用 JOINS 查询我的 Cosmos 数据的查询,查询如下所示

SELECT c.id, c.ItemLevel, c.ItemNo, bv.variantId, bv.variantDescription AS title, c.BasicData.presentation.articleLongDescription[0] AS Description, c.BasicData.presentation.articleCompositionList.origin, bv.size.sizeName, c.DetailedData.locales[0].images ?? c.BasicData.asset.assets[0].locations[1].path AS images, 'SE' AS country, 'SEK' AS currency, 'en' AS language, l.categories AS categories, c.PriceData.WhitePrice, c.PriceData.RedPrice, c.PriceData.DiscountPercentage, c.PriceData.TypeOfDiscount
FROM c
JOIN bv IN c.BasicData.base.sales.variants
JOIN l IN c.DetailedData.locales
WHERE c.brand = 'XXX'
AND l.country = 'SE'
AND l.language = 'en'
AND c.ItemNo = 'XXX'
AND c.Season = 'XXX'
AND c.Consumer = 'XXX'

只要我的 JOINS 有数据,这个查询就可以工作,但是如果 c.DetailedData 是 NULL 那么它就不会 return 任何东西。

我怎样才能做到 return 无论可用数据是什么,而忽略不存在的数据。

我知道我可以使用 c.foo ?? c.bar 但仅当 属性 存在时才有效,如果 JOIN 中使用的整个对象不存在则不存在。

这个 JOIN 问题与文档结构无关

根据我的经验,Left Join 在 cosmos db 中不受支持。显然,一个数据集加入一个空数组,结果是一个空数据集,你什么也得不到!这不是关系数据库。

1.https://social.msdn.microsoft.com/Forums/en-US/a08a8029-1bd7-4e70-8408-ddb6e268d9ac/left-join-in-azure-cosmosdb-sql-api?forum=azurecosmosdb

2.https://feedback.azure.com/forums/263030-azure-cosmos-db/suggestions/37949650-support-left-join

所以,恐怕您必须分别查询 BasicDataDetailedData 之间的数据,然后尝试根据需要合并数据。

或者您可以使用传输工具(例如 ADF)将 cosmos 数据库数据扁平化为 sql db.So,您可以正常使用关系数据库 sql。