我有一個這樣的清單:
[
{
student: "a",
package: [
{name: "one", createdAt: "2021-10-12T00:00:00", active: true},
{name: "two", createdAt: "2021-10-13T00:00:00", active: false},
{name: "three", createdAt: "2021-10-14T00:00:00", active: false}
]
},
{
student: "b",
package: [
{name: "one", createdAt: "2021-10-16T00:00:00", active: true},
{name: "two", createdAt: "2021-10-17T00:00:00", active: false},
{name: "three", createdAt: "2021-10-18T00:00:00", active: false}
]
},
{
student: "c",
package: [
{name: "one", createdAt: "2021-10-10T00:00:00", active: true},
{name: "two", createdAt: "2021-10-17T00:00:00", active: false},
{name: "three", createdAt: "2021-10-18T00:00:00", active: false}
]
}
]
我不知道如何進行查詢 (Mongodb) 以根據包陣列中的createdAt 和active: true對該串列進行排序?
期望看起來像這樣:
[
{
student: "c",
package: [
{name: "one", createdAt: "2021-10-10T00:00:00", active: true},
...
]
},
{
student: "a",
package: [
{name: "one", createdAt: "2021-10-12T00:00:00", active: true},
...
]
},
{
student: "b",
package: [
{name: "one", createdAt: "2021-10-16T00:00:00", active: true},
...
]
},
]
有人可以幫我解決這個問題嗎?我想到了這個想法只是使用代碼對其進行排序,但是可以使用查詢 MongoDB 嗎?
uj5u.com熱心網友回復:
詢問
- 為每個檔案創建一個排序鍵,這是活動包成員的最新日期($reduce 這樣做,這保留了最大日期)
- 按它排序
- 取消設定以洗掉這個額外的鍵
*對于降序或升序,您可以使用排序 -1更改$gtwith$lt和排序 1。取決于你需要什么。如果您使用$lt替換"0"也像一個最大的字串"9"。或者,如果您有實際日期,則帶有最小或最大日期。
測驗代碼在這里
aggregate(
[{"$set":
{"sort-key":
{"$reduce":
{"input": "$package",
"initialValue": "0",
"in":
{"$cond":
[{"$and":
["$$this.active", {"$gt": ["$$this.createdAt", "$$value"]}]},
"$$this.createdAt", "$$value"]}}}}},
{"$sort": {"sort-key": 1}},
{"$unset": ["sort-key"]}])
uj5u.com熱心網友回復:
您可以使用此聚合查詢:
- 首先
$unwind解構陣列 ang 獲取每個值。 - 然后
$sort通過主動。 $group獲取初始資料但已排序。- 最后
$sort再由createdAt.
db.collection.aggregate([
{
"$unwind": "$package"
},
{
"$set": {
"package.createdAt": {
"$toDate": "$package.createdAt"
}
}
},
{
"$sort": {
"package.active": -1
}
},
{
"$group": {
"_id": "$_id",
"student": {
"$first": "$student"
},
"package": {
"$push": "$package"
}
}
},
{
"$sort": {
"package.createdAt": 1
}
}
])
示例在這里
另外,要進行排序,最好createdAt是一個Date欄位,否則你應該決議到日期。像這個例子
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/340237.html
