Reputation: 3832
I'm having a (hopefully) small syntax problem with $pull
in Mongodb.
bulk.find({_id: new mongo.ObjectID(req.session._id)}).updateOne({$pull: {
firstArray: {id: req.params.id},
'secondArray.firstArrayIds': req.params.id
'secondArray.$.firstArrayIds': req.params.id
}});
The firstArray $pull
works just fine.
But the secondArray.firstArrayIds and/or secondArray.$.firstArrayIds
does not. What am I doing wrong here?
This is my data structure:
clients: {
firstArray: [
{
_id: '153'.
someField1: 'someVal1',
}
...
]
secondArray: [
{
_id: '7423'.
someField1: 'someVal1',
firstArrayIds: [153, 154, 155, ...]
}
...
]
}
EDIT What if there are more than one embedded object in secondArray
which firstArrayIds
can contain the id i want to delete. In other words, when deleting an object in firstdArray
i want to delete references in all secondArray
's firstArrayIds
Not just the first match.
Upvotes: 1
Views: 1035
Reputation: 151112
Your "secondArray" has a nested element structure, so you must identify the outer element you want to match in your query when using a positional $
operator in the update. You basically need something like this:
bulk.find({
"_id": new mongo.ObjectID(req.session._id),
"secondArray._id": "7423"
}).update({
"$pull": {
"firstArray": { "_id": "153" },
"secondArray.$.firstArrayIds": 153
}
});
So there are in fact "two" id values you need to pass in with your request in addition to the general document id. Even though this is nested it is okay since you are only matching on the "outer" level and only on one array. If you tried to match the position on more than one array then this is not possible with the positional operator.
Upvotes: 2