3 回答

TA貢獻(xiàn)2051條經(jīng)驗 獲得超10個贊
根據(jù)評論更新:
但UUID是字母數(shù)字字符串,如上所示,它對這些排序有影響嗎?由于我們沒有使用條件來獲取結(jié)果,我擔(dān)心它會引起問題。
您可以使用附加字段將排序順序匹配為與 in 表達(dá)式中的值相同的順序。確保您提供的值默認(rèn)為最后一個值。
[
{"$match":{"jobUuid":{"$in":["d275781f-ed7f-4ce4-8f7e-a82e0e9c8f12","default"]}}},
{"$addFields":{ "order":{"$indexOfArray":[["d275781f-ed7f-4ce4-8f7e-a82e0e9c8f12","default"], "$jobUuid"]}}},
{"$sort":{"uuid":1, "order":1}},
{
"$group": {
"_id": "$uuid",
"doc":{"$first":"$$ROOT"}
}
},
{"$project":{"doc.order":0}},
{"$replaceRoot":{"newRoot":"$doc"}}
]
此處示例 - https://mongoplayground.net/p/wXiE9i18qxf
原來的
您可以使用以下查詢。如果 uuid 存在,查詢將選擇非默認(rèn)文檔,否則選擇默認(rèn)文檔作為唯一文檔。
[
{"$match":{"jobUuid":{"$in":[1,"default"]}}},
{"$sort":{"uuid":1, "jobUuid":1}},
{
"$group": {
"_id": "$uuid",
"doc":{"$first":"$$ROOT"}
}
},
{"$replaceRoot":{"newRoot":"$doc"}}
]
此處示例 - https://mongoplayground.net/p/KrL-1s8WCpw

TA貢獻(xiàn)1811條經(jīng)驗 獲得超5個贊
這是我要做的:
匹配階段使用 $in 而不是 $or (為了可讀性)
小組賽階段使用 $uuid 上的 _id,就像您所做的那樣,但不要將所有數(shù)據(jù)推送到數(shù)組中,而是更具選擇性。_id 已經(jīng)存儲了 $uuid,因此沒有理由再次捕獲它。每個 $uuid 的名稱必須始終相同,因此僅采用第一個實例。根據(jù)匹配,jobUuid 只有兩種可能性,但這將假設(shè)它將是“默認(rèn)”或其他內(nèi)容,并且可能會出現(xiàn)多次非“默認(rèn)”jobUuid。使用“$addToSet”而不是推送到數(shù)組,以防用戶多次出現(xiàn)相同的 jobUuid,此外,在添加到集合之前,使用條件僅添加非“默認(rèn)”jobUuid,使用 $$REMOVE以避免在 jobUuid 為“默認(rèn)”時插入 null。
最后,“$project”來清理一切。如果 jobUuids 數(shù)組的元素 0 不存在(為 null),則該用戶除了 jobUuid 為“默認(rèn)”之外沒有其他可能性,因此使用“$ifNull”進(jìn)行測試并根據(jù)需要設(shè)置“默認(rèn)”。這里可能有超過 1 個 jobUuid,具體取決于您的數(shù)據(jù)庫/應(yīng)用程序是否允許,由您決定如何處理(取最高的、取最低的等)。
測試于:https://mongoplayground.net/p/e76cVJf0F3o
[{
"$match": {
"jobUuid": {
"$in": [
"1",
"default"
]
}
}
},
{
"$group": {
"_id": "$uuid",
"name": {
"$first": "$name"
},
"jobUuids": {
"$addToSet": {
"$cond": {
"if": {
"$ne": [
"$jobUuid",
"default"
]
},
"then": "$jobUuid",
"else": "$$REMOVE"
}
}
}
}
},
{
"$project": {
"_id": 0,
"uuid": "$_id",
"name": 1,
"jobUuid": {
"$ifNull": [{
"$arrayElemAt": [
"$jobUuids",
0
]
},
"default"
]
}
}
}]

TA貢獻(xiàn)1864條經(jīng)驗 獲得超6個贊
我能夠通過以下聚合查詢解決這個問題,
jobUuid
我們首先提取僅與用戶提供的或"default"
匹配部分中的匹配的結(jié)果。然后,使用小組賽階段根據(jù) uuid 對結(jié)果進(jìn)行分組,并且我們也會對結(jié)果進(jìn)行計數(shù)。
使用首先的條件,
replaceRoot
我們檢查分組文檔的長度,如果分組文檔長度大于或等于 2,我們將過濾與提供的 jobUuid 匹配的文檔。
如果它小于或等于 1,那么我們將檢查它是否與 jobUuid 匹配
default
并返回它。
查詢?nèi)缦拢?/p>
[
{
$match: {
$or: [{ jobUuid:1 },{ jobUuid: 'default'}]
}
},
{
$group: {
_id: '$uuid',
count: {
$sum: 1
},
docs: {
$push: '$$ROOT'
}
}
},
{
$replaceRoot: {
newRoot: {
$cond: {
if: {
$gte: [
'$count',
2
]
},
then: {
$arrayElemAt: [
{
$filter: {
input: '$docs',
as: 'item',
cond: {
$ne: [
'$$item.jobUuid',
'default'
]
}
}
},
0
]
},
else: {
$arrayElemAt: [
{
$filter: {
input: '$docs',
as: 'item',
cond: {
$eq: [
'$$item.jobUuid',
'default'
]
}
}
},
0
]
}
}
}
}
}
]
添加回答
舉報