2017-07-05 15 views
0

CosmosDBクエリエクスプローラで次のクエリを実行しました。Azure CosmosDBクエリエクスプローラの結果とAzure関数の結果の差

SELECT c.id, c.created_at FROM c 
WHERE c.created_at_epoch <= 1499871600 - 86400*31 
AND (CEILING(1499871600/86400) - CEILING(c.created_at_epoch/86400)) % 31 = 0 

結果は次のとおりです。

[ 
    { 
    "id": "70251cbf-44b3-4cd9-991f-81127ad78bca", 
    "created_at": "2017-05-11 18:46:16" 
    }, 
    { 
    "id": "0fa31de2-4832-49ea-a0c6-b517d64ede85", 
    "created_at": "2017-05-11 18:48:22" 
    }, 
    { 
    "id": "b9959d15-92e7-41c3-8eff-718c4ab2be6e", 
    "created_at": "2017-05-11 19:01:43" 
    } 
] 

これは問題がないようです。

次に、静的に定義されたエポック値を、Azure関数DocumentDB入力バインディングのsqlQueryとして使用するためのプレースホルダに置き換えました。その後、私はthis issue

SELECT c.id, c.created_at FROM c 
WHERE c.created_at_epoch <= {epoch} - 86400*31 
AND (CEILING({epoch}/86400) - CEILING(c.created_at_epoch/86400)) %modulationsymbol% 31 = 0 

を回避するための%modulationsymbol%に変調記号を置き換えそして私は、アプリケーションの設定としてmodulationsymbol = %を定義しました。

application setting

次のように続いて、私は、関数を指定しました。

// index.js 
module.exports = function (context, myQueueItem) { 
    context.log(context.bindings.members, myQueueItem); 
    context.done(); 
}; 

// function.json 
{ 
    "bindings": [ 
    { 
     "name": "myQueueItem", 
     "type": "queueTrigger", 
     "direction": "in", 
     "queueName": "myqueue", 
     "connection": "MYSTORAGE" 
    }, 
    { 
     "type": "documentDB", 
     "name": "members", 
     "databaseName": "myproject-db", 
     "collectionName": "member", 
     "sqlQuery": "SELECT c.id, c.created_at FROM c WHERE {epoch} - c.created_at_epoch >= 86400*31 AND (CEILING({epoch}/86400) - CEILING(c.created_at_epoch/86400)) %modulationsymbol% 31 = 0", 
     "connection": "MYCOSMOSDB", 
     "direction": "in" 
    } 
    ], 
    "disabled": true 
} 

その後、私はこの機能をトリガし、この結果は以下の通りです。

2017-07-05T03:57:29.640 Function started (Id=d980521e-d23a-4bda-a730-57a236bcd011) 
2017-07-05T03:57:30.594 [] { epoch: 1499871600 } 
2017-07-05T03:57:30.594 Function completed (Success, Id=d980521e-d23a-4bda-a730-57a236bcd011, Duration=951ms) 

context.bindings.membersは空のリストです。 CosmosDB Query Explorerの結果とは異なります。

この違いが表示されるのはなぜですか?

答えて

1

{epoch}を印刷した後、そのタイプは文字列であり、予想されるタイプは文字列ではなく数字であることがわかりました。これは、同じクエリを使用するときに空のリストを取得する理由です。

この問題を解決するには、タイプをnumberに変換してからクエリ結果をフィルタリングします。あなたの参照のための以下のステップ。

ステップ1、文字列を数値に変換できるUDFを作成します。スクリプトExplorer->ユーザー定義関数を作成

enter image description here

function toNumber(ts) { 
    return parseInt(ts); 
} 

ステップ2、後ConvertToNumber機能を作成し、あなたは数に{}エポックの種類を変換するためにそれを使用することができます。

SELECT c.id, c.created_at FROM c 
WHERE c.created_at_epoch <= udf.ConvertToNumber({epoch}) - 86400*31 
AND (CEILING(udf.ConvertToNumber({epoch})/86400) - CEILING(c.created_at_epoch/86400)) %modulationsymbol% 31 = 0 

C#をよく知っていれば、C#で関数を作成できます。 C#は強く型付けされた言語なので、キューからメッセージを逆シリアル化するために使用されるクラスを定義できます。言語レイヤの型を変換します。

public class EpochMessage 
{ 
    public int epoch { get; set; } 
} 

機能全体がこのようになる可能性があります。

using System; 

public static void Run(EpochMessage myQueueItem, TraceWriter log, IEnumerable<dynamic> members) 
{ 
    log.Info(context.bindings.members, myQueueItem); 
} 

public class EpochMessage 
{ 
    public int epoch { get; set; } 
} 
+0

私は今、それを得ました、ありがとう。しかし、Script Explorerは私のリソースには存在しません。 ![CosmosDBブレイドのスナップショット](https://wo1xyw.bn1303.livefilestore.com/y4mqQudG0QUSljYoqClYpqVI2q9xmWS9Qow1BXnrDc8affQPlO831trFXTPLAc3HSAw6hKVm5gdSQCT9TyEHCrNCYTQkudgS2c-h_sQcaqWrn0xcv7heMAtt9BsnxRbxqmxZXY0dVqi2fSJQiiVkfw-KouSo62JE2PvP28os2yF8UvPmMib5I3NNQr9_EosgbYq_ZrG4k1IgGIV36CoKZsqKg?width = 214&height = 272&cropmode = none) – ytnobody

+0

UDFをサポートしていないAzure MongoDBを使用していますか?私が挑戦したのは、Azure DocumentDBです。 – Amor

+0

また、私の返信を編集してC#バージョンの回避策を提供します。 – Amor

関連する問題