Database
db={"items":[{"_id":1,"categories":["catX","catY","catZ"]},{"_id":2,"categories":["catY","catX","catZ"]},{"_id":3,"categories":["catZ","catX","catY"]},{"_id":4,"categories":["catX","catZ","catY"]}],"categories":[{"_id":"catX","sortOrder":1,"name":"Category A"},{"_id":"catY","sortOrder":2,"name":"Category B"},{"_id":"catZ","sortOrder":3,"name":"Category C"}]}
Query
db.items.aggregate([{$addFields:{categoriesWithIndex:{$map:{input:{$range:[0,{$size:"$categories"}]},as:"index",in:{index:"$$index",value:{$arrayElemAt:["$categories","$$index"]}}}}}},{$unwind:"$categoriesWithIndex"},{$lookup:{from:"categories",localField:"categoriesWithIndex.value",foreignField:"_id",as:"categoryDetails"}},{$addFields:{"categoriesWithIndex.sortOrder":{$arrayElemAt:["$categoryDetails.sortOrder",0]}}},{$group:{_id:"$_id",categories:{$push:{$mergeObjects:[{index:"$categoriesWithIndex.index",sortOrder:"$categoriesWithIndex.sortOrder",value:"$categoriesWithIndex.value"}]}}}},{$addFields:{isSortOrderIncreasing:{$reduce:{input:{$range:[1,{$size:"$categories"}]},initialValue:true,in:{$and:["$$value",{$cond:{if:{$gt:[{$arrayElemAt:["$categories.sortOrder","$$this"]},{$arrayElemAt:["$categories.sortOrder",{$subtract:["$$this",1]}]}]},then:true,else:false}}]}}}}}])