Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure CosmosDB查询资源管理器和#x27;s结果和Azure函数结果_Azure_Azure Functions_Azure Cosmosdb - Fatal编程技术网

Azure CosmosDB查询资源管理器和#x27;s结果和Azure函数结果

Azure CosmosDB查询资源管理器和#x27;s结果和Azure函数结果,azure,azure-functions,azure-cosmosdb,Azure,Azure Functions,Azure Cosmosdb,我在CosmosDB查询资源管理器上执行了以下查询 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 看来这个问题不存在 接下来,我将静态定义的历元值替换为占位符,以便将其用作Azure函数DocumentDB输入

我在CosmosDB查询资源管理器上执行了以下查询

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
看来这个问题不存在

接下来,我将静态定义的历元值替换为占位符,以便将其用作Azure函数DocumentDB输入绑定的sqlQuery。然后,我将调制符号替换为
%modulationsymbol%
,以避免

之后,我触发了这个函数,结果如下

[
  {
    "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"
  }
]
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查询浏览器的结果不同


为什么会出现这种差异?

在打印出{epoch}之后,我发现它的类型是string,预期的类型是number而不是string。这就是使用同一查询时获取空列表的原因

要解决此问题,可以先将类型转换为数字,然后再使用它筛选查询结果。以下步骤供您参考

步骤1,创建一个可以将字符串转换为数字的自定义项。脚本资源管理器->创建用户定义函数

第2步,在创建ConvertToNumber函数后,可以使用它将{epoch}的类型转换为number

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
整个功能可以是这样的

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; }
}
使用系统;
公共静态无效运行(EpochMessage myQueueItem、TraceWriter日志、IEnumerable成员)
{
log.Info(context.bindings.members,myQueueItem);
}
公共类EpochMessage
{
公共整数纪元{get;set;}
}

我现在拿到了,谢谢。但我的资源中不存在脚本资源管理器!您是否正在使用不支持UDF的Azure MongoDB?我尝试的是Azure DocumentDB。我还编辑了我的回复以提供C版本的解决方案。我从一开始就使用这个CosmosDB资源,它被称为DocumentDB。今天,EA ProDirect支持人员向我传授了解决此问题的方法。以下是解决方案的步骤。Data Explorer(预览)->[收集菜单(看起来像“…”)]->新的用户定义函数,然后将sqlQuery替换为新查询。这就是全部。感谢您,问题已经解决。我很高兴听到您的问题已经解决,感谢您分享您的解决方案。
function toNumber(ts) { 
   return parseInt(ts);
}
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
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; }
}