gpt4 book ai didi

javascript - mongo 根据条件聚合来过滤文档以进行版本控制

转载 作者:行者123 更新时间:2023-12-02 02:33:07 29 4
gpt4 key购买 nike

我正在进行版本控制,我们有基于 UUIDjobUuids 的文档,jobUuids 是与当前工作用户关联的文档。我对这些集合有一些聚合查询,需要根据作业 UUID 进行更新,

聚合查询获取的结果应该是这样的,

  • 如果当前用户jobUuid文档不存在,则返回jobUuid: "default"的主文档(没有任何jobUuid的文档),
  • 如果作业 uuid 存在,则仅返回文档。

我有一个$match用于根据某些条件获取这些文档,我需要从这些文档中过滤出基于上述条件的文档,示例如下,

数据如下所示:

[
{
"uuid": "5cdb5a10-4f9b-4886-98c1-31d9889dd943",
"name": "adam",
"jobUuid": "default",
},
{
"uuid": "5cdb5a10-4f9b-4886-98c1-31d9889dd943",
"jobUuid": "d275781f-ed7f-4ce4-8f7e-a82e0e9c8f12",
"name": "adam"
},
{
"uuid": "b745baff-312b-4d53-9438-ae28358539dc",
"name": "eve",
"jobUuid": "default",
},
{
"uuid": "b745baff-312b-4d53-9438-ae28358539dc",
"jobUuid": "d275781f-ed7f-4ce4-8f7e-a82e0e9c8f12",
"name": "eve"
},
{
"uuid": "26cba689-7eb6-4a9e-a04e-24ede0309e50",
"name": "john",
"jobUuid": "default",
}
]

"jobUuid": "d275781f-ed7f-4ce4-8f7e-a82e0e9c8f12" 的结果应为:

[
{
"uuid": "5cdb5a10-4f9b-4886-98c1-31d9889dd943",
"jobUuid": "d275781f-ed7f-4ce4-8f7e-a82e0e9c8f12",
"name": "adam"
},
{
"uuid": "b745baff-312b-4d53-9438-ae28358539dc",
"jobUuid": "d275781f-ed7f-4ce4-8f7e-a82e0e9c8f12",
"name": "eve"
},
{
"uuid": "26cba689-7eb6-4a9e-a04e-24ede0309e50",
"name": "john",
"jobUuid": "default",
}
]

基于上述条件,是否可以在聚合查询中过滤文档,提取特定职位uuid的文档?

编辑1:我得到了以下解决方案,该解决方案工作正常,我想要一个更好的解决方案,消除所有这些嵌套阶段。

编辑 2:使用实际 UUID 更新了数据,我只包含 name 作为另一个字段,我们确实有 n 个与包含不相关的字段在这里,但在最后需要(为那些想要在所有字段上使用投影的人提及这一点)。

最佳答案

根据评论更新:

but the UUIDs are alphanumeric strings, as shown above, does it havean effect on these sorting, and since we are not using conditions toget the results, I am worried it will cause issues.

您可以使用附加字段来匹配排序顺序,使其与 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

关于javascript - mongo 根据条件聚合来过滤文档以进行版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64774589/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com