操場
我有一個包含 6 個檔案的簡單陣列,其中一個的狀態為 1。我想從具有此狀態的檔案中獲取 prop 的值,并過濾掉具有此值但狀態為 0 的其他檔案。
前任。
{
"InviteId": 1, <================================= Keep
"InviteStatus": 1,
"PartnerCompany" : "Monstra",
"MeetingDate" : "2021-09-05T15:00:00.000 0000",
"MeetingStartTime" : "12:55",
},
{
"InviteId": 2,
"InviteStatus": 0,
"PartnerCompany" : "Empresa Teste",
"MeetingDate" : "2021-09-05T15:00:00.000 0000",
"MeetingStartTime" : "12:55",
},
{
"InviteId": 3, <================================= Exclude
"InviteStatus": 0,
"PartnerCompany" : "Monstra",
"MeetingDate" : "2021-09-07T15:00:00.000 0000",
"MeetingStartTime" : "12:55",
},
{
"InviteId": 4,
"InviteStatus": 0,
"PartnerCompany" : "Empresa Teste",
"MeetingDate" : "2021-09-07T15:00:00.000 0000",
"MeetingStartTime" : "12:55",
},
{
"InviteId": 5, <================================= Exclude
"InviteStatus": 0,
"PartnerCompany" : "Monstra",
"MeetingDate" : "2021-09-06T15:00:00.000 0000",
"MeetingStartTime" : "12:55",
},
{
"InviteId": 6,
"InviteStatus": 0,
"PartnerCompany" : "Empresa Teste",
"MeetingDate" : "2021-09-06T15:00:00.000 0000",
"MeetingStartTime" : "12:55",
}
在此示例中,InviteId: 1 的狀態為:1,此檔案具有 de partnerName: Monstra。所以我需要排除其他檔案,其中 partnerName == Monstra with status == 0。
因此,最終串列將有 4 個檔案(InviteIds:1,2,4,6)而不是像今天這樣的 6 個。
干杯
uj5u.com熱心網友回復:
如果您使用的是 MongoDB 5.0,
您可以使用$setWindowFields為“磁區”/“組”(即PartnerCompany在您的示例中)聚合“排名”,并僅選擇排名最高的檔案。排名可以定義為InviteStatus: -1您希望保留InviteStatus: 1最高排名的記錄。
{
"$setWindowFields": {
"partitionBy": "$PartnerCompany",
"sortBy": {
"InviteStatus": -1
},
"output": {
"rank": {
$rank: {}
}
}
}
}
這是Mongo 游樂場供您參考。
如果您使用的是 Mongo 3.6
您可以在PartnerCompany現場進行自我查找。在子管道中,只保留InviteStatus查找中大于源檔案的記錄。
情況1:源檔案有InviteStatus: 1;沒有檔案的 InviteStatus 比您大,因此您的查找將回傳空陣列
情況2:源檔案有InviteStatus: 0;您的查找將回傳非空陣列
過濾查找陣列以保留/修剪源檔案。
{
"$lookup": {
"from": "collection",
let: {
pc: "$PartnerCompany",
currStatus: "$InviteStatus"
},
pipeline: [
{
$match: {
$expr: {
$and: [
{
$eq: [
"$$pc",
"$PartnerCompany"
]
},
{
$lt: [
"$$currStatus",
"$InviteStatus"
]
}
]
}
}
}
],
"as": "checkingResult"
}
}
這是Mongo Playground供大家參考
uj5u.com熱心網友回復:
如果您有 >= Mongodb 5,則$setWindowFields解決方案看起來很完美。
如果不是 MongoDB 5,也請嘗試以下方法,因為如果不是 MongoDB 5,則使用管道查找,并且$expr據我所知無法使用索引,因此它會很慢,您可以對其進行測驗以確保。
詢問
測驗代碼在這里
aggregate(
[{"$group":
{"_id": "$PartnerCompany",
"max": {"$max": "$InviteStatus"},
"docs": {"$push": "$$ROOT"}}},
{"$set":
{"docs":
{"$cond":
[{"$eq": ["$max", 1]}, [{"$arrayElemAt": ["$docs", 0]}], "$docs"]}}},
{"$unwind": {"path": "$docs"}},
{"$replaceRoot": {"newRoot": "$docs"}}])
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/330092.html
