こんばんは。今週も引き続きもくもくとアプリ開発をしているわけですが、今週は特にMicrsoft AzureのCosmosDBと戦う一週間になりそうです。
色々と直感的でない(自分がCosmosDBの思想に馴染めていないだけか・・?)と思うところがありつまづきまくっていますので、そういったところを記事に残しておきたいと思います。
ということで、今日はAzure Functions上にデプロイしたAPIで、Cosmos DBの複数のコンテナからJOINなどを使って結合してデータを取得する方法がないか調べたので、その結果についてまとめておきます。
まず、Cosmos DBバインディングではダメ
どうやら、Azure FunctionsのCosmosDBバインディングはシングルコンテナの操作しか対応していないようで、複数コンテナのハンドルはできない模様。以下にディスカッションがあった。
うーむ、他にあるのか、調べてみた。
結局、そんな方法はサポートされていないことがわかる
結局、いろんな記事を探したけど見つけられず、公式Docsで質問してみることにした。
すると1日で返答が返ってきた。
https://github.com/MicrosoftDocs/azure-docs/issues/79560
You can’t query multiple containers under any circumstances whether via the portal or the SDKs.
Cosmos DB is a NoSQL database. It does not support relational constructs like joins.
Worth checking out a few resources that can help you learn how to design for this type of database.
回答より
結論、CosmosDB(というか、NoSQL)の思想的に、そういった方法はそもそもサポートされていないとのこと。Azure Functionsに限らず、CosmosDB SDKやポータルを使ってもできないとのこと。
CosmosDBのデータモデルを工夫して、1つのコンテナ上で処理が簡潔するような作りにする必要がありそうです。
RDBの思想がまだまだ抜けないですね・・・勉強になりました。
追記:以下のStack Overflowでも議論がありましたね。同様の結論です。
https://stackoverflow.com/questions/62512550/how-to-query-from-two-containers-in-cosmos-db-sql-api
おしまい