Условный фильтр Монго

#node.js #arrays #mongodb #mongoose #mongodb-query

Вопрос:

Я рассматриваю фильтрацию только в том случае, если пользователь желает выполнить фильтрацию на основе определенного критерия.

Я могу фильтровать просто отлично, используя $in, но когда критерии, используемые в фильтре $in, не предусмотрены, он жалуется, что ему нужен массив. Замена его на [] приводит к тому, что он возвращается пустым, и у меня нет списка всех возможных значений для вставки (и я не уверен, что хотел бы этого).

Есть какие-нибудь идеи? Цвета ниже являются необязательными критериями. *Было бы неплохо, если бы был флаг пропуска, который я мог бы использовать.

  const profiles = await Profile.aggregate([
      {
        $geoNear: {
          ...geoFilter,
        },
      },
      {
        $match: {
          $and: [
            {
              _id: {
                $ne: Profile.castID(req.user.profileID),
              },
              colors: { $in: colors },
            },
          ],
        },
      },
      { $skip: skip },
      { $limit: limit },
    ]);
 

Ответ №1:

Используйте этот:

 var match = { _id: {$ne: Profile.castID(req.user.profileID)} };
if (typeof colors != "undefined") {
   match.colors = { $in: colors };
}

Profile.aggregate([
  {
    $geoNear: {
      ...geoFilter,
    },
  },
  { $match: match },
  { $skip: skip },
  { $limit: limit },
]);          
 

Вам это не нужно $and , однако в случае, если у вас возникнет ситуация, когда это необходимо, используйте

 var match = [{ _id: {$ne: Profile.castID(req.user.profileID)} }];
if (typeof colors != "undefined") {
   match.push({colors: { $in: colors }});
}

Profile.aggregate([
  {
    $geoNear: {
      ...geoFilter,
    },
  },
  { $match: {$and: match}},
  { $skip: skip },
  { $limit: limit },
]);