【发布时间】:2021-11-21 21:26:39
【问题描述】:
我正在尝试对这两个集合进行左反连接。
我希望所有部门等于“IT”的用户未参加 endAt 时间 > 175 的会议。无论是作为创建者还是接收者。 所以基本上是在最近 xxx 时间没有参加会议的人。
基于以下集合: John 将被找回,因为他是 IT 部门的一员,并且在“175”之后不再是接收者或创建者。 Jane 在 175 之后有一个 endAt 时间,并且在 IT 部门,所以不会被检索到 比尔是金融部门的,所以即使他没有,也没关系 Bob 在 175 之后有一个 endAt 时间并且在 IT 部门,因此不会被检索到 Mary 在 IT 部门,但没有参加任何会议,因此她被找回。
用户收藏:
[
{
_id: ObjectId("1"),
name: "john",
department: 'IT'
},
{
_id: ObjectId("2"),
name: "jane",
department: 'IT'
},
{
_id: ObjectId("3"),
name: "bill",
department: 'finance'
},
{
_id: ObjectId("4"),
name: "Bob",
department: 'IT'
},
{
_id: ObjectId("5"),
name: "Mary",
department: 'IT'
}
]
会议集:
[
{
_id: ObjectId("a"),
endedAt: 100,
creator_id: ObjectId("1"),
receiver_id: ObjectId("2")
},
{
_id: ObjectId("b"),
endedAt: 150,
creator_id: ObjectId("1"),
receiver_id: ObjectId("3")
},
{
_id: ObjectId("c"),
endedAt: 200,
creator_id: ObjectId("4"),
receiver_id: ObjectId("2")
},
{
_id: ObjectId("d"),
endedAt: 250,
creator_id: ObjectId("2"),
receiver_id:
}
]
输出:
[
{
_id: ObjectId("1"),
name: "john",
department: 'IT'
},
{
_id: ObjectId("5"),
name: "Mary",
department: 'IT'
}
]
我的做法:
db.users.aggregate([
{
$match:
{
type: 'IT'
}
},
{
$lookup:
{
from: "meetings",
let:
{
userid: "$_id",
},
pipeline: [
{ $match:
{ $expr:
{
$and:[
{
$or: [
{ $eq: ["$receiver_id", "$$userid"] },
{ $eq: ["$creator_id", "$$userid"] },
]
},
{ $gt: ["$endAt", 175] }
]
}
}
}
],
as: "result"
}
},
{
$unwind:
{
path: "$result",
preserveNullAndEmptyArrays: true
}
},
{
$match:
{
result: {$exists:false}
}
}
])
【问题讨论】:
-
尝试
$lookup与管道,查看mongodb文档,并删除未连接的文档,过滤掉空数组(连接结果) -
感谢@Takis_ 我已经尝试过并且得到了奇怪的结果。我将再次尝试并发布我的尝试。
标签: node.js mongodb mongodb-query anti-join