对于一个建筑安全系统,我想得到最后一次刷卡的时间,为一个特定的学生根据他们的身份证序列号。我正在使用这个代码
var _collection = database.GetCollection<BsonDocument>("entrycard_swipetimes");
var filter = Builders<BsonDocument>.Filter.Eq("studentid", "stu-1234") & Builders<BsonDocument>.Filter.Eq("Carddetails.LastSwipeTimestamp", "2021-11-25T10:50:00.5230694Z");
var doc = _collection.Find(filter).FirstOrDefault();这是json文档的片段。
{
"studentid"; "stu-1234",
"Carddetails":
{
"LastSwipeTimestamp": "2021-11-25T10:50:00.5230694Z"
}
}上面的代码正常工作,我得到了一条记录,但我需要提前知道确切的时间字符串。怎样才能得到最后一次学生刷卡的机会?我如何获得系统中所有学生的最后一个时间戳,并在过去30天中每次由20名学生传呼?
发布于 2021-11-29 20:34:40
修改Filter并添加一个排序:
var filter = Builders<BsonDocument>.Filter.Eq("studentid", "stu-1234");
var doc = _collection.Find(filter).Sort("{\"Carddetails.LastSwipeTimestamp\":-1}").FirstOrDefault();强烈建议将Carddetails.LastSwipeTimestamp更改为实时日期类型,而不是ISO8601字符串。
发布于 2021-11-29 21:31:01
为了获得最后一次特定学生(studentId)刷卡的机会:
var filter = Builders<BsonDocument>.Filter.Eq("studentid", studentId);
var doc = collection
.Find(filter)
.SortByDescending(bson => bson["Carddetails.LastSwipeTimestamp"])
.FirstOrDefault();要获得系统中所有学生的最后一个时间戳,并让pageSize学生在过去的lastDaysCount天中一次传呼:
var doc = collection
.Aggregate()
.Group(new BsonDocument
{
{ "_id", "$studentid" },
{
"LastSwipeTimestamp", new BsonDocument
{
{ "$max", "$Carddetails.LastSwipeTimestamp" }
}
},
})
.Match(bson => bson["LastSwipeTimestamp"] > DateTime.Now.AddDays(-lastDaysCount))
.Skip((page - 1) * pageSize)
.Limit(pageSize)
.ToList();但是,要使其工作,您应该将您的日期存储为Date类型。
https://stackoverflow.com/questions/70160799
复制相似问题