Lets' say I have a collection called settings
, that has a document where the _name
field has a value of A
and in there there is a data.year
value i.e.
"settings" : [
{
_id: ObjectId('123123123123'),
_name: "A",
data: {
year: 2025
}
}
]
I am then creating an aggregation in another collection, let's call it B
, where my lookup
is matching documents in A
but needs to be filtered based on the year
value from the settings
collection document above i.e.
"B": [
{
shortName: "B1"
},
{
shortName: "B2"
}
]
"A" : [
{
name: "A2",
shortNameInA: "B1",
datesInfo: {
closed: ISODate("2025-12-10"),
}
},
{
name: "A3",
shortNameInA: "B2",
datesInfo: {
report: ISODate("2025-03-10"),
}
},
{
name: "A1",
shortNameInA: "B1",
datesInfo: {
closed: ISODate("2024-12-10"),
}
}
]
db.B.aggregate([
{
from: "A",
localField: "shortName",
foreignField: "shortNameInA",
pipeline: [
{
$match: {
$expr: {
$or: [
{
$eq: [
{
$year: "$datesInfo.closed"
},
{
$year: "$$NOW" <--- This needs to be `year` value from settings
}
]
},
{
$eq: [
{
$year:
"$datesInfo.report"
},
{
$year: "$$NOW" <--- This needs to be `year` value from settings
}
]
}
]
}
}
}
],
as: "_fromA"
}
What I need to do is pass in that year
value instead of $$NOW
- how do I do that ?
So, in this example it would pass in 2025 and I should get the following view:
[
{
shortName: "B1",
_fromA: [
{
name: "A2",
shortNameInA: "B1",
datesInfo: {
closed: ISODate("2025-12-10"),
}
}
]
},
{
shortName: "B2",
_fromA: [
{
name: "A3",
shortNameInA: "B2",
datesInfo: {
report: ISODate("2025-03-10"),
}
}
]
}
]
A full example is available here.
You can do a separate, unconditional$lookup
to the settings
collection first. Then, continue with your current $lookup
by setting data.year
as a variable
db.B.aggregate([
{
"$lookup": {
"from": "settings",
"let": {
"settingsKey": "A"
},
"pipeline": [
{
"$match": {
$expr: {
$eq: [
"$$settingsKey",
"$_name"
]
}
}
}
],
"as": "settingsLookup"
}
},
{
"$unwind": "$settingsLookup"
},
{
$lookup: {
from: "A",
localField: "shortName",
foreignField: "shortNameInA",
let: {
settingYear: "$settingsLookup.data.year"
},
pipeline: [
{
$match: {
$expr: {
$or: [
{
$eq: [
{
$year: "$datesInfo.closed"
},
"$$settingYear"
]
},
{
$eq: [
{
$year: "$datesInfo.report"
},
"$$settingYear"
]
}
]
}
}
}
],
as: "_fromA"
}
},
{
"$unset": "settingsLookup"
}
])