I am trying to do a filter on something. Here is a simplified layout of my Order model:
{
merchant: <Reference to the merchant>,
date: <Date Object>
name: "Some order name",
ingredients: [{
ingredient: {data: "some data"}
otherData: "some data"
}]
}
I want to query the documents based on the ingredients that they contain. I have an array of items to search through “objectifiedIngredients”. If it has ingredients in it, then I want to search for orders that contain that ingredient. If the array is empty, then I want to not do the query and just get all orders. “objectifiedIngredients” is a list of ObjectId’s. Here is what I have so far:
Order.aggregate([
{$match:{
merchant: new ObjectId(req.session.user),
date: {
$gte: from,
$lt: to
},
ingredients: {
$elemMatch: {
ingredient: {
$in: objectifiedIngredients
}
}
}
}}
])
How can I run the $match on ingredients only if the array has elements in it? I have tried using $cond, but either it doesn’t work here or I didn’t use it right.
Advertisement
Answer
Try this
Order.aggregate([
{$match:{
merchant: new ObjectId(req.session.user),
date: {
$gte: from,
$lt: to
},
ingredients: {
$ne: false
}
}}
])
You can check for more details here