Как получить результат из массива, в котором пользователь уже выбрал ключ__городи, если пользователь выбрал_городи и те, кто придет, также придут не выбранный город из МОДЕЛИ ГОРОДА - PullRequest
1 голос
/ 25 октября 2019

Модель города

[
  {
    "_id": '1',
    "city":'A',
  },
   {
    "_id": '2',
    "city":'B',
  },
   {
    "_id": '3',
    "city":'C',
  },
  {
    "_id": '4',
    "city":'D',
  },
  {
    "_id": '5',
    "city":'E',
  }
]

Модель пользователя

[
  {
    "_id": '1',
    "user":'sams',
    "selected_city":['1','2']
  } 
]

Хотел бы получить результат от

[

{

  "_id": "1",

  "user": "sams",

"selected_city": [
      "1",
      "2"
    ],

"not_selected": [
      "3",
      "4",
      "5"
    ]
 
  }
]

Ответы [ 3 ]

1 голос
/ 25 октября 2019

Вы можете использовать ниже агрегации

db.coll2.aggregate([
  {
    $lookup: {
      from: "coll1",
      pipeline: [],
      as: "cities"
    }
  },
  {
    $addFields: {
      not_selected: {
        $setDifference: [
          "$cities._id",
          "$selected_city"
        ]
      }
    }
  }
])
1 голос
/ 25 октября 2019

Попробуйте:

const cities = [
  {
    "_id": '1',
    "city":'A',
  },
   {
    "_id": '2',
    "city":'B',
  },
   {
    "_id": '3',
    "city":'C',
  },
  {
    "_id": '4',
    "city":'D',
  },
  {
    "_id": '5',
    "city":'E',
  }
];


const users = [
  {
    "_id": '1',
    "user":'sams',
    "selected_city":['1','2']
  } 
];

const result = users.map(user => {
  user.not_selected = cities
    .filter(city => !user.selected_city.includes(city._id))
    .map(city => city._id)
  return user;
});

console.log(result);
0 голосов
/ 25 октября 2019

Это немного нестандартно,

может быть немного хакерским,

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, а затем только выбранный конкретный город.

Надеюсь, это поможет! :-)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...