I want to get some objects from array of objects in a mongodb document my document looks something like this
{
movieDetails: {
movieId: 333,
movieName: "movie",
},
Dates: [
{
Date: " 01/07/2021",
TheaterId: 12,
Is3D: "false",
},
{
Date: " 09/07/2021",
TheaterId: 13,
Is3D: "false",
},
{
Date: " 03/07/2021",
TheaterId: 12,
Is3D: "false",
}
]
}
I want to get only the objects where the movieId
is equal to 333 and TheaterId
is 12 my result should look like this
[
{
Date: " 01/07/2021",
TheaterId: 12,
Is3D: "false",
},
{
Date: " 03/07/2021",
TheaterId: 12,
Is3D: "false",
}
]
I tried this
const dates = await Movie.find("movieDetails.movieId": 333).select({ Dates: {$elemMatch: {TheaterId: 12}}});
But it returns only the first object if anyone can help me with this I will be very grateful
According to $elemMatch
docs:
The $elemMatch operator limits the contents of an field from the query results to contain only the first element matching the $elemMatch condition.
So you can use this aggregation pipeline using $filter
into a $project
stage like this:
Movie.aggregate([
{
"$match": {
"movieDetails.movieId": 333
}
},
{
"$project": {
"movieDetails": 1,
"Dates": {
"$filter": {
"input": "$Dates",
"as": "d",
"cond": {
"$eq": [
"$$d.TheaterId",
12
]
}
}
}
}
}
])
Example here
Or this another pipeline (I prefer using $filter
)
Movie.aggregate([
{
"$match": {
"movieDetails.movieId": 333
}
},
{
"$unwind": "$Dates"
},
{
"$match": {
"Dates.TheaterId": 12
}
},
{
"$group": {
"_id": "$_id",
"movieDetails": {
"$first": "$movieDetails"
},
"Dates": {
"$push": "$Dates"
}
}
}
])
Example here
Collected from the Internet
Please contact [email protected] to delete if infringement.
Comments