Reputation: 368
My goal is to:
status=true
.active=true
in the life
array.Below is what my MongoDB documents look like:
{
"name": "justine",
"life" : [
{
"status" : true,
"service" : [
{
"partner" : "pat 1",
"active" : true,
},
{
"partner" : "pat 2",
"active" : false
}
}
]
},
{
"name": "okumu",
"life" : [
{
"status" : true,
"service" : [
{
"partner" : "pat 1",
"active" : true,
},
{
"partner" : "pat 2",
"active" : true
}
}
]
}
Expected output:
{
"name": "justine",
"life" : [
{
"status" : true,
"service" : [
{
"partner" : "pat 1",
"active" : true,
}
}
]
},
{
"name": "okumu",
"life" : [
{
"status" : true,
"service" : [
{
"partner" : "pat 1",
"active" : true,
},
{
"partner" : "pat 2",
"active" : true
}
}
]
}
This is what I did:
await Users.find({ life: { $elemMatch: { status: true, life: { $elemMatch: { active: false } } } }});
This is working well for the first condition, in case the second condition is not met, the entire object is not returned, however, if it's met, even the active=false
objects are returned.
I'll be grateful if you can help me out, am not a MongoDB expert.
Upvotes: 0
Views: 40
Reputation: 51440
I think it is complex (possible not doable) with the .find()
query.
You should use .aggregate()
query.
$match
- Filter document with life.status
is true
.
$project
-
2.1 $filter
- Filter the document with status
is true
in life
array document.
2.1.1 $map
- Merge the life
document with the Result 2.1.1.1.
2.1.1.1 $filter
- The inner $filter
operator to filter the document with active
is true
for service
document in service
array.
db.collection.aggregate([
{
$match: {
"life.status": true
}
},
{
$project: {
name: 1,
life: {
"$filter": {
"input": {
"$map": {
"input": "$life",
"in": {
"$mergeObjects": [
"$$this",
{
"service": {
"$filter": {
"input": "$$this.service",
"as": "service",
"cond": {
$eq: [
"$$service.active",
true
]
}
}
}
}
]
}
}
},
as: "life",
"cond": {
$eq: [
"$$life.status",
true
]
}
}
}
}
}
])
Upvotes: 1