如何从Azure Function中的cosmos DB文档触发器中获取JSON对象

时间:2019-01-06 01:26:02

标签: azure-functions azure-cosmosdb eventtrigger

在cosmos mongo DB中,我插入了一个简单的文档:

{  
    "_id" : ObjectId("5c315585e0f53d69fc3820a1"),  
    "id" : "replace_with_new_document_id",  
    "time" : 678900.43,  
    "num" : 5678  
}

然后我有一个由Cosmos Mongo DB的更新触发的Azure函数集,最终得到了一个如图所示的文档对象:

enter image description here

我的问题是将原始JSON数据(即“ id”,“ time”,“ num”)转换为C#结构的最简单方法是什么:

public struct info   
{  
  public string id;  
  public double time;  
  public int num;  
}

3 个答案:

答案 0 :(得分:0)

基于official article中的语句:

  

Azure Cosmos DB绑定仅支持与SQL API一起使用。   对于所有其他Azure Cosmos DB API,您应该访问数据库   通过使用API​​的静态客户端从您的函数中   MongoDB API,Cassandra API,Gremlin API和Table API。

,到目前为止,您无法在mongo api上使用azure cosmos db触发功能。

您可以关注此博客,尝试与您的cosmos db mongo api db绑定:

https://www.mongodb.com/blog/post/how-to-integrate-azure-functions-with-mongodb

答案 1 :(得分:0)

即使对MongoDB API变更供稿没有官方支持,如果您设法将文档放入触发器中(显然可以做到),则只需映射$t-$v键将值对与一个对象配对,然后获取值。

我首先创建一个CosmosMongoValue类,该类对每个属性的键值对进行反序列化。

public class CosmosMongoValue<T>
{
    [JsonProperty("$v")]
    public T Value { get; set; }

    public static implicit operator T(CosmosMongoValue<T> item)
    {
        return item?.Value;
    }
}

,然后您的Info类将如下所示:

public class Info
{  
    [JsonProperty("id")]
    public CosmosMongoValue<string> Id;  

    [JsonProperty("time")]
    public CosmosMongoValue<double> Time;

    [JsonProperty("num")]   
    public CosmosMongoValue<int> Num;  
}

然后只需使用JsonConvert.DeserializeObject<CosmosMongoValue<Info>>即可将字符串文档解析为对象。

您可以执行.Value来获取对的值,也可以只使用值类型从我在CosmosMongoValue类中添加的隐式运算符中自动获取值。

结果:

enter image description here

答案 2 :(得分:0)

获取起点ObjectId 尝试使用base64解码document.id

let orderId = new Buffer(document.id,'base64')。toString();    context.log('order id:',orderId);

在您的情况下,document.id为'NWMzMTU1ODVlMGY1M2Q2OWZjMzgyMGEx'