在 mongodb 聚合中从另一个数组中的项目过滤数组项目
Filtering array items from items in another array in mongodb aggregation
我已经设法创建了一个聚合,其中 returns 文档中的两个数组,如下所示:
"b": [
{
"_id": "6258bdfe983a2d31e1cc6a4b",
"booking_room_id": "619395ba18984a0016caae6e",
"checkIn_date_time": "2022-04-16",
"checkOut_date_time": "2022-05-17"
}
]
"r": [
{
"_id": "619395ba18984a0016caae6e",
}
]
如果 r
中的 _id
匹配 b
中的 booking_room_id
,我想从 r
中删除该项目。
此外,由于这些数组存在于父文档中。如果 r
在执行过滤器后为空,我想从查询中删除父文档。
使用$expr
和$filter
db.collection.aggregate([
{
$match: {
$expr: {
$ne: [
{
$filter: {
input: "$r",
as: "r",
cond: {
$not: { $in: [ "$$r._id", "$b.booking_room_id" ] }
}
}
},
[]
]
}
}
},
{
$set: {
r: {
$filter: {
input: "$r",
as: "r",
cond: {
$not: { $in: [ "$$r._id", "$b.booking_room_id" ] }
}
}
}
}
}
])
我已经设法创建了一个聚合,其中 returns 文档中的两个数组,如下所示:
"b": [
{
"_id": "6258bdfe983a2d31e1cc6a4b",
"booking_room_id": "619395ba18984a0016caae6e",
"checkIn_date_time": "2022-04-16",
"checkOut_date_time": "2022-05-17"
}
]
"r": [
{
"_id": "619395ba18984a0016caae6e",
}
]
如果 r
中的 _id
匹配 b
中的 booking_room_id
,我想从 r
中删除该项目。
此外,由于这些数组存在于父文档中。如果 r
在执行过滤器后为空,我想从查询中删除父文档。
使用$expr
和$filter
db.collection.aggregate([
{
$match: {
$expr: {
$ne: [
{
$filter: {
input: "$r",
as: "r",
cond: {
$not: { $in: [ "$$r._id", "$b.booking_room_id" ] }
}
}
},
[]
]
}
}
},
{
$set: {
r: {
$filter: {
input: "$r",
as: "r",
cond: {
$not: { $in: [ "$$r._id", "$b.booking_room_id" ] }
}
}
}
}
}
])