$addField с условием в MongoDB

#mongodb #mongoose

Вопрос:

У меня есть запрос, и я хочу, чтобы при fullname существовании поля добавлялось поле с именем type со значением ‘Users’, а при наличии name вместо fullname я хочу добавить поле type со значением ‘POSTS’

Вот моя реализация, но она не работает:

 const result = await User.aggregate([
  {
    $unionWith: "recipes",
  },
  {
    $match: {
      $or: [
        {
          fullname: { $regex: query, $options: "i" },
        },
        {
          username: { $regex: query, $options: "i" },
        },
        {
          name: {
            $regex: query,
            $options: "i",
          },
        },
      ],
    },
  },
  { $project: { _id: 1, fullname: 1, name: 1 } },
  {
    $addFields: {
      type: {
        $cond: [
          {
            $exist: "fullname",
          },
          "POSTS",
          "USERS",
        ],
      },
    },
  },
  { $skip: parseInt(skip) },
  { $limit: parseInt(limit) },
]);
 

Ответ №1:

Проблема заключалась в том, что у нас нет $exist оператора агрегирования, поэтому мы делаем это с помощью $type оператора (оператор exist query не может использоваться при агрегировании вне соответствия)

Запрос 1

  • вы можете использовать это, если хотите, чтобы значение if fullname было ложным (например null , , missing , false ) для получения USERS типа

PlayMongo

 aggregate([
  {
    "$set": {
      "type": {
        "$cond": [
          "$fullname",
          "USERS",
          "POSTS"
        ]
      }
    }
  }
])
 

Запрос 2

  • вы можете использовать это, если хотите, только тогда, когда поле отсутствует

PlayMongo

 aggregate([
  {
    "$set": {
      "type": {
        "$cond": [
          {
            "$eq": [
              {
                "$type": "$fullname"
              },
              "missing"
            ]
          },
          "POSTS",
          "USERS"
        ]
      }
    }
  }
])