gpt4 book ai didi

Mongodb聚合查找查询——返回所有子文档

转载 作者:可可西里 更新时间:2023-11-01 10:36:30 25 4
gpt4 key购买 nike

this 开始问题,我希望根据相关子文档中的值过滤父文档列表。

给定以下 mongoDB 集合....

    // 'job' collection
{
"id" : j1,
"mediaID" : "ABC1234"
},
{
"id" : j2,
"mediaID" : "DEF1234"
}

..和..

    // 'task' collection

// j1 tasks
{
"id" : "t1",
"job" : "j1",
"taskName": "MOVE",
"status" : "COMPLETE"
},
{
"id" : "t2",
"job" : "j1",
"taskName": "PUBLISH",
"status" : "FAILED"
},
// j2 tasks
{
"id" : "t3",
"job" : "j2",
"taskName": "MOVE",
"status" : "COMPLETE"
},
{
"id" : "t4",
"job" : "j2",
"taskName": "PUBLISH",
"status" : "COMPLETE"
}

..其中任务集合通过 job.id -> task.job 链接到作业集合

我有一个聚合查询,它将根据子集合中的条件过滤 job 集合。我正在使用 Mongo 的 $lookup 的管道语法,并有一个类似这样的查询....

db.getCollection("job").aggregate(
[
{

"$lookup": {
"from" : "task",
"let" : {
"job_id": "$_id"
},
"pipeline": [
{
"$match": {
"$expr": {
"$and": [
{
// link job.id to task.job
"$eq": ["$job", "$$job_id"]
},
{
// Filter taskName
"$eq": ["$taskName", "PUBLISH"]
},
{
// Filter by status
"$eq": ["$status", "FAILED"]
}
]
}
}
}
],
"as" : "tasks"
}
},
{
// Remove ROOT docs that do not meet 'task' criteria
"$match": {
"tasks": {"$ne": []}
}
}
]
);

这工作得很好,除了我希望在结果中返回父级的 所有 子文档,而不仅仅是匹配的子文档。

例如,上面的查询给了我这个...

  {
"id" : j1,
"mediaID" : "ABC1234"
"tasks" : [
{
"id" : "t2",
"job" : "j1",
"taskName": "PUBLISH",
"status" : "FAILED"
},
]
},

..但我想要这个...

  {
"id" : j1,
"mediaID" : "ABC1234"
"tasks" : [
{
"id" : "t1",
"job" : "j1",
"taskName": "MOVE",
"status" : "COMPLETE"
},
{
"id" : "t2",
"job" : "j1",
"taskName": "PUBLISH",
"status" : "FAILED"
},
]
},

我有一个想法,我需要在某些时候使用 $push,但我很难过!任何帮助表示赞赏。

最佳答案

您应该将过滤逻辑移出 $lookup 并运行 $match作为下一个流水线阶段。在那里你可以使用 $anyElementTrue运算符检查是否有任何具有所需值的子文档:

db.job.aggregate([
{
$lookup: {
from: "task",
localField: "id",
foreignField: "job",
as: "tasks"
}
},
{
$match: {
$expr: {
$anyElementTrue: {
$map: {
input: "$tasks",
in: {
$and: [
{ $eq: [ "$$this.taskName", "PUBLISH" ] },
{ $eq: [ "$$this.status", "FAILED" ] }
]
}
}
}
}
}
}
])

免责声明:您的数据/聚合中有两个不同的字段名称:taskNametaskCode。我决定使用第一个。

关于Mongodb聚合查找查询——返回所有子文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56245106/

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