gpt4 book ai didi

c# - 日期之间的 MongoDB C# 驱动程序聚合返回空字段

转载 作者:可可西里 更新时间:2023-11-01 09:14:53 24 4
gpt4 key购买 nike

我正在为 mongodb 使用 c# 驱动程序,并希望对我正在创建的 Web API 使用聚合查询。对于我的聚合查询,我关注的是一个包含用户名、日期和步骤的配置文件类。我想创建一个查询来选择用户名并获取给定一周的总步数,按总步数降序排列。我只想显示他们的用户名和总步数。

当我尝试聚合查询时,我遇到了一个问题,我的一些字段显示为空。因此,我认为我的查询结构不正确。

我有一个“Profile”类,目前我正在为我的数据使用它。

[BsonIgnoreExtraElements]
[DataContract]
public class Profile
{
[DataMember]
public string Username { get; set; }

[DataMember]
public DateTime Date { get; set; }

[DataMember]
public uint? Steps { get; set; }
}

我已经使用以下内容创建了一些测试数据,例如配置文件

//Test data
for (uint index = 1; index < 20; index++)
{
Profile aprofile = new Profile
{
Username = string.Format("testuser{0}", index),
Date = RandomDay(),
Steps = (index + index + index)*2

};
AddProfile(aprofile);
}

如果我多次运行代码并查询特定用户,我会得到如下数据:

[{"Username":"testuser1","Date":"2014-07-03T00:00:00Z","Steps":6},
{"Username":"testuser1","Date":"2014-07-07T05:00:00Z","Steps":6},
{"Username":"testuser1","Date":"2014-07-17T05:00:00Z","Steps":6},
{"Username":"testuser1","Date":"2014-07-18T05:00:00Z","Steps":6}]

然后,我有几个静态方法来查找聚合查询的最早日期和最晚日期。

//gets a datetime for the earlist date and time possible for the current week
public static DateTime GetStartOfCurrentWeek()
{
int DaysToSubtract = (int)DateTime.Now.DayOfWeek;
DateTime dt = DateTime.Now.Subtract(TimeSpan.FromDays(DaysToSubtract));
return new DateTime(dt.Year, dt.Month, dt.Day, 0, 0, 0, 0);
}

//gets a datetime for the latest date and time possible for the current week
public static DateTime GetEndOfCurrentWeek()
{
DateTime dt = GetStartOfCurrentWeek().AddDays(6);
return new DateTime(dt.Year, dt.Month, dt.Day, 23, 59, 59, 999);
}

下面是我对聚合查询的尝试。

//Here is my aggregation query to get all profiles within a given week, 
public IEnumerable<Profile> GetAllProfiles()
{
DateTime StartofWeek = GetStartOfCurrentWeek();
DateTime EndofWeek = GetEndOfCurrentWeek();


var match = new BsonDocument
{{ "$match", new BsonDocument
{{ "Date", new BsonDocument {
{"$gte", StartofWeek},
{"$lt", EndofWeek}
}}}
}};

var group = new BsonDocument
{{"$group",
new BsonDocument
{{ "_id", new BsonDocument
{{"id", "$Username"},

}},
{"Steps", new BsonDocument
{{"$sum", "$Steps"}}
}}
}};


var sort = new BsonDocument
{{"$sort", new BsonDocument
{{"Steps", -1}}

}};



var pipeline = new[] {match, group, sort};

var args = new AggregateArgs { Pipeline = pipeline, OutputMode = AggregateOutputMode.Inline };

// run the aggregation query and get a list of BsonDocuments
IEnumerable<BsonDocument> documents = _profiles.Aggregate(args);
}

但是,我得到的结果显示用户名为空,日期为空。

[{"Username":null,"Date":"0001-01-01T00:00:00","Steps":96},
{"Username":null,"Date":"0001-01-01T00:00:00","Steps":66},
{"Username":null,"Date":"0001-01-01T00:00:00","Steps":24}]

我需要做什么来获取我的文档数组,以便用户名与我的总步骤一起显示(这似乎有效)。我不希望查询结果中出现日期。仅用户名和该周的总步数。

最佳答案

我真的不明白你为什么需要用BSon查询你的mongo。你有你的模型类。您尝试执行的聚合将如下所示:

var result = collection.Aggregate()
.Match(r => r.Date >= StartofWeek && r.Date < EndofWeek)
.Group(r=>r.Username, r=> new {UserName = r.Key, Dates = r.Select(d=>d.Date), Steps = r.Sum(x=>x.Steps)})
.ToList();

请注意,您可以获得的不是一个日期,而是一组日期,因此我将其聚合为 Dates

原因,您看不到日期和用户名的原因是您没有查询它,在您的小组声明中我只看到步骤总和。如果你真的想继续这样查询,你应该把它添加到你的小组阶段,比如:

var group = new BsonDocument
{
{ "_id", new BsonDocument{{"id", "$Username"},
}},
{"Steps", new BsonDocument{{"$sum", "$Steps"}}},
{ "Dates", new BsonDocument{{"$addToSet", "$Date"}} },
{ "Username", new BsonDocument{{"$first", "$Username"}} },
};

这样我就可以在生成的 BsonDocument 中看到用户名和日期。

但是正如我已经说过的,这种查询 Mongo 的方式并不是用 c# 做的最好的方式

关于c# - 日期之间的 MongoDB C# 驱动程序聚合返回空字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24874026/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com