3 回答
TA贡献2051条经验 获得超10个赞
根据评论更新:
但UUID是字母数字字符串,如上所示,它对这些排序有影响吗?由于我们没有使用条件来获取结果,我担心它会引起问题。
您可以使用附加字段将排序顺序匹配为与 in 表达式中的值相同的顺序。确保您提供的值默认为最后一个值。
[
{"$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 存在,查询将选择非默认文档,否则选择默认文档作为唯一文档。
[
{"$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贡献1811条经验 获得超5个赞
这是我要做的:
匹配阶段使用 $in 而不是 $or (为了可读性)
小组赛阶段使用 $uuid 上的 _id,就像您所做的那样,但不要将所有数据推送到数组中,而是更具选择性。_id 已经存储了 $uuid,因此没有理由再次捕获它。每个 $uuid 的名称必须始终相同,因此仅采用第一个实例。根据匹配,jobUuid 只有两种可能性,但这将假设它将是“默认”或其他内容,并且可能会出现多次非“默认”jobUuid。使用“$addToSet”而不是推送到数组,以防用户多次出现相同的 jobUuid,此外,在添加到集合之前,使用条件仅添加非“默认”jobUuid,使用 $$REMOVE以避免在 jobUuid 为“默认”时插入 null。
最后,“$project”来清理一切。如果 jobUuids 数组的元素 0 不存在(为 null),则该用户除了 jobUuid 为“默认”之外没有其他可能性,因此使用“$ifNull”进行测试并根据需要设置“默认”。这里可能有超过 1 个 jobUuid,具体取决于您的数据库/应用程序是否允许,由您决定如何处理(取最高的、取最低的等)。
测试于: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贡献1864条经验 获得超6个赞
我能够通过以下聚合查询解决这个问题,
jobUuid
我们首先提取仅与用户提供的或"default"
匹配部分中的匹配的结果。然后,使用小组赛阶段根据 uuid 对结果进行分组,并且我们也会对结果进行计数。
使用首先的条件,
replaceRoot
我们检查分组文档的长度,如果分组文档长度大于或等于 2,我们将过滤与提供的 jobUuid 匹配的文档。
如果它小于或等于 1,那么我们将检查它是否与 jobUuid 匹配
default
并返回它。
查询如下:
[
{
$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
]
}
}
}
}
}
]
添加回答
举报