使用C#查询CosmosDB文档

问题描述 投票:0回答:2

我有存储在cosmos db中的文档,我有同一个“stationkey”(分区键)的多个文档,在本例中,stationkey“ABC”有多个带有“yymm”的文档有“2018-02”和“2018-” 01" 等,

我正在尝试的查询是获取给定的 stationkey 和 yymm 过滤器组合的所有“avg”和“dd”字段以及“yymm”

JSON Document

我正在尝试使用 C# 进行查询,我正在尝试从“data”数组中获取“avg”、“dd”和“yymm”字段,我编写的查询给出了整个“data”数组。

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

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

c# mongodb azure-cosmosdb
2个回答
2
投票

这样你就得到了 s => s.data 中的数据。 要仅从数组中获取平均值,您必须进行另一个投影,如下所示:

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

修改我的答案,因为你说你在“数据”上找不到“选择”。

定义一个 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
投票

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

var weatherQuery = this.docClient.CreateDocumentQuery<WeatherStation>(docUri, queryOptions)
    .Where(wq => wq.stationName == stationKey && lstYearMonthFilter.Contains(wq.yearMonth))
    .SelectMany(x => x.data.Select(y => new { x.yymm, data = new[] { new { y.dd, y.avg } } }))
    .AsDocumentQuery();

var results = new List<WeatherStation>();

while (weatherQuery.HasMoreResults)
{
    results.AddRange(await weatherQuery.ExecuteNextAsync<WeatherStation>());
}

var groupedResults = results
    .GroupBy(x => x.yymm)
    .Select(x => new { x.First().yymm, data = x.SelectMany(y => y.data).ToArray() })
    .Select(x => new WeatherStation() { yymm = x.yymm, data = x.data });
© www.soinside.com 2019 - 2024. All rights reserved.