I have a user.expenses collection like this
{
userId: ObjectId("62f332b93753ac926ff6ac62"),
expenses: [
{
name: 'electricity',
assigned: 400,
given: 400,
},
{
name: 'restaurant',
assigned: 2100,
given: 0,
}
]
}
I will get userId and expenses.name(electricity) from the request. I need to check if the user.expenses collection has any expenses document whose name is electricity and assigned is not equal to given.
I used $elemMatch and could check if there are any embedded documents whose name is electricity.
db.user.expenses.find({
userId: ObjectId('62f332b93753ac926ff6ac62'),
expenses: {
$elemMatch: {
name: 'electricity',
},
},
});
EDIT
I also tried to use $where. But it only can be applied to the top-level document.
CodePudding user response:
Query
- you cant do it with query operators because you want to reference a field but you can do it with aggregate operators and
$filter - filter the array and keep only if
electricityandassigned!=given - keep the document if at least one sub-document was
electricitywithassigned!=given
aggregate(
[{"$match":
{"$expr":
{"$ne":
[{"$filter":
{"input": "$expenses",
"cond":
{"$and":
[{"$eq": ["$$this.name", "electricity"]},
{"$ne": ["$$this.assigned", "$$this.given"]}]}}}, []]}}}])
