私のcosmosDBコレクションには、次のようなタイプのエンティティがあります。
// Suppliers:
[{
"id": "some_unique_str",
"products": [
"id_of_product1",
"id_of_product2"
]
}]
// Products:
[{
"id": "id_of_product1",
"name": "product name"
},
//...
]
このような結果を得るには、クエリを作成する必要があります。
[{
"id": "some_unique_str",
"products": [
{
"id": "id_of_product1",
"name": "product 1 name"
},
{
"id": "id_of_product2",
"name": "product 2 name"
}
]
}]
言い換えれば、私はOData拡張機能を実現しようとしています。出来ますか?
cosmos db sqlapiの直接SQLではそれを実現できません。ニーズは、no-sqlデータベースではなく、リレーショナルデータベースの外部キーを使用して実装できます。
cosmos db sql apiでは、ストアドプロシージャを使用してこれを実現できます。参照用にいくつかのコードを記述しようとしました。
function sample(prefix) {
var collection = getContext().getCollection();
var isAccepted = collection.queryDocuments(
collection.getSelfLink(),
'SELECT c.id,c.products FROM c where is_defined(c.products)',
function (err, feed, options) {
if (err) throw err;
if (!feed || !feed.length) {
var response = getContext().getResponse();
response.setBody('no docs found');
}
else {
var response = getContext().getResponse();
var returnArray = [];
for (var i=0;i<feed.length;i++){
var map = {};
map['id'] = feed[i].id;
mergeData(map,feed[i].products);
returnArray.push(map);
}
response.setBody(returnArray);
}
});
if (!isAccepted) throw new Error('The query was not accepted by the server.');
function mergeData(map,idArray){
var sqlQuery = {
"query": 'SELECT c.id,c.name FROM c where not is_defined(c.products) and '+
' array_contains( @idArray,c.id,true) ',
"parameters": [
{"name": "@idArray", "value": idArray}
]
}
var isAccepted = collection.queryDocuments(
collection.getSelfLink(),
sqlQuery,
function (err, feed, options) {
if (err) throw err;
if (!feed || !feed.length) {
map['products'] = [];
}
else {
map['products'] = feed;
}
});
}
}
サンプルデータの出力は次のとおりです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加