Вам нужен оператор $ setDifference , попробуйте:
db.collection.aggregate([
{
$match: {
"languagesknow.lng": { $type: "array" }
}
},
{
$project: {
languagesknow: {
$setDifference: [ [ "2", "5", "6" ], "$languagesknow.lng" ]
}
}
}
])
РЕДАКТИРОВАТЬ: вы можете поставить $match
перед $setDifference
, чтобы отфильтровать все документы, где languagesknow.lng
не является массивом (используется оператор $ type ).
EDIT (2): если вы хотите получить один массив для всей коллекции, то вам нужно добавить $ group с $ unwind , чтобы собрать все языки в одном массиве, а затем запустите $setDifference
, попробуйте:
db.collection.aggregate([
{
$match: {
"languagesknow.lng": { $type: "array" }
}
},
{
$unwind: "$languagesknow.lng"
},
{
$group: {
_id: null,
languagesknow: { $addToSet: "$languagesknow.lng" }
}
},
{
$project: {
languagesknow: {
$setDifference: [ [ "2", "5", "6" ], "$languagesknow" ]
}
}
}
])