使用C#查询CosmosDB文档

时间:2018-02-16 16:23:22

标签: c# mongodb azure-cosmosdb

我有存储在cosmos db中的文件,我有多个文件用于相同的“stationkey”(分区键),在这个例子中,stationkey“ABC”有多个文件,“yymm”有“2018-02”& “2018-01”e.t.c,

我正在尝试的查询是获得所有“avg”&对于给定的stationkey和yymm过滤器组合,“dd”字段和“yymm”

JSON Document

我正在尝试使用C#进行查询,我试图获得“avg”,“dd”& “data”数组中的“yymm”字段,我写的查询给出了整个“数据”数组。

var weatherQuery = this.docClient.CreateDocumentQuery<WeatherStation>(docUri, queryOptions)
            .Where(wq => wq.stationName == stationKey && lstYearMonthFilter.Contains(wq.yearMonth))
            .Select(s => s.data);

从文档数组中查询特定字段的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

所以你得到s =&gt;中的数据s.data。要从阵列中仅获得平均值,您必须执行另一个投影,如下所示:

.Select (s => s.data.Select ( a => a.avg ))

修改我的答案,因为你说你找不到&#39;选择&#39;关于&#39;数据&#39;。

定义一个MyDocument类:

public class Datum
{
    [JsonProperty("dd")]
    public string dd;

    [JsonProperty("max")]
    public int max;

    [JsonProperty("min")]
    public int min;

    [JsonProperty("avg")]
    public int avg;
}

public class MyDocument : Document
{
    [JsonProperty("id")]
    public string id;

    [JsonProperty("data")]
    public Datum[] data;
}

相应地修改您的代码

IDocumentQuery<MyDocument> query = client.CreateDocumentQuery<MyDocument>(UriFactory.CreateDocumentCollectionUri(_database, _collection),
            new FeedOptions { MaxItemCount = -1, EnableCrossPartitionQuery = true, MaxDegreeOfParallelism = 199, MaxBufferedItemCount = 100000})
            .Where(predicate)
            .AsDocumentQuery();

      while (query.HasMoreResults)
        {
            FeedResponse<MyDocument> feedResponse = await query.ExecuteNextAsync<MyDocument>();
            Console.WriteLine (feedResponse.Select(x => x.data.Select(y => y.avg)));
        }

HTH

答案 1 :(得分:1)

您可以使用双嵌套匿名类从数组项中仅选择特定字段 - 请参阅下面更改的SelectMany。这将返回每个Datum的yymm,因此可能没有选择整个数组那么高效 - 在两种情况下都可以测量RU / s。

Dim t As String
t = "T0"
cnt = 4

For n = 1 To 23
    ActiveSheet.Range("$A$1:$P$1000000").AutoFilter Field:=2, Criteria1:= _
    ">=" & FromTime & t & n & ":00", Operator:=xlAnd, Criteria2:=" <= " & FromTime & t & n & ":30"
Next n