Database

[{"name":"routeA","locations":[{"name":"A","precedence":1},{"name":"B","precedence":2},{"name":"C","precedence":3}]},{"name":"routeB","locations":[{"name":"A","precedence":2},{"name":"B","precedence":1},{"name":"C","precedence":3}]},{"name":"routeB","locations":[{"name":"A","precedence":2},{"name":"D","precedence":1},{"name":"C","precedence":3}]}]

Query

db.collection.aggregate([{$match:{"locations.name":{$all:["A","B"]}}},{$addFields:{route:{$sortArray:{input:{$filter:{input:"$locations",cond:{$in:["$$this.name",["A","B"]]}}},sortBy:{name:1}}}}},{$match:{$expr:{$lt:[{$first:"$route.precedence"},{$last:"$route.precedence"}]}}},{$unset:"route"}])

Result