我有存储在cosmos db中的文档,我有同一个“stationkey”(分区键)的多个文档,在本例中,stationkey“ABC”有多个带有“yymm”的文档有“2018-02”和“2018-” 01" 等,
我正在尝试的查询是获取给定的 stationkey 和 yymm 过滤器组合的所有“avg”和“dd”字段以及“yymm”
我正在尝试使用 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);
从文档数组中查询特定字段的最佳方法是什么?
这样你就得到了 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
您可以使用双重嵌套匿名类从数组项中仅选择特定字段 - 请参阅下面更改的 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 });