Это немного нестандартно,
может быть немного хакерским,
db.userCity.aggregate({$match:{}},
{$lookup: { from: "cities", localField: "id", foreignField: "id", as: "city"}},
//where "id" in localField and "id" in foreignfield are the fields that does not exists in both collections
{$project:{
selectedCity: {
$filter: {
input:"$city",
as:"c",
cond: { $in: [ "$$c._id", "$selected_city" ] }
}
},
notSelectedCities: {
$filter: {
input: "$city",
as: "c",
cond:{ $eq: [{ $indexOfArray: [ "$selected_city", "$$c._id" ] }, -1] }
}
}
}}).pretty()
Я не знаю, в лучшем случае это происходит или нет ...
но, как вы можете видеть на моем этапе $ lookup, я использовал "id" в localField
и foreignField
, а "id" не существует в обоихusers
и cities
collection,
таким образом вы получаете все документы из cities
collection для пользователя.
Затем на этапе $project
я использовал $filter
для фильтрациирезультаты
, затем для notSelectedCities
я использовал оператор $indexOfArray
, если город не указан в selected_city, он вернет -1 и сравнил его, используя $eq
оператор с -1, а затем только выбранный конкретный город.
Надеюсь, это поможет! :-)