對于樓宇安全系統,我想根據特定學生的 ID 序列號獲取上次刷卡時間。我正在使用此代碼
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 名學生進行傳呼?
uj5u.com熱心網友回復:
要獲取特定學生 ( 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型別。
uj5u.com熱心網友回復:
Filter如此修改并添加排序:
var filter = Builders<BsonDocument>.Filter.Eq("studentid", "stu-1234");
var doc = _collection.Find(filter).Sort("{Carddetails.LastSwipeTimestamp:-1}").FirstOrDefault();
強烈建議您更改Carddetails.LastSwipeTimestamp為真正的日期時間型別而不是 ISO8601 字串。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/369802.html
上一篇:我們為什么要使用公共方法?
