Использовать $ slice с $ map для $ lookup в MongoDB? - PullRequest
0 голосов
/ 28 июня 2018

- Привет, у меня есть запрос агрегации с поиском, мне нужно спроектировать определенные поля из этого поиска и нарезать их. Это то, что я сделал до сих пор.

{
$lookup: {
  from: 'users',
  localField: 'users',
  foreignField: '_id',
  as: 'users',
}},

Я добавил выражение для размотки

{
$unwind: {
  path: '$users',
  preserveNullAndEmptyArrays: true
}},

Я добавил групповой оператор

{ $group: { _id: { _id: '$_id', createdAt: '$createdAt', updatedAt: '$updatedAt' }, users: { $addToSet: '$users', } } },

И чтобы спроектировать определенные поля в массиве пользователей, я сделал:

{
$project: {
  _id: '$_id._id',
  createdAt: '$_id.createdAt',
  updatedAt: '$_id.updatedAt',
  // users: {
  //   $slice: [
  //     "$users",
  //     skip,
  //     limit
  //   ]
  // },
  users: {
    $map: {
        input: '$users',
        as: 'user',
        in: {
          email: '$$user.email',
          name: '$$user.name',
          username: '$$user.username',
          updatedAt: '$$user.updatedAt'
        }
     }
  }
}},

Мой вопрос: как я могу использовать $ slice в этой области?

1 Ответ

0 голосов
/ 28 июня 2018

Я не знаю, как это 'legal' , но я добавил поля в оператор $ addToSet в $ group , так что теперь я можно использовать $ slice с сопоставленными полями .

{
    $group: {
      _id: {
        _id: '$_id',
        createdAt: '$createdAt',
        updatedAt: '$updatedAt',
      },
      users: {
        $addToSet: {
          _id: '$users._id',
          email: '$users.email',
          name: '$users.name',
          username: '$users.username',
          updatedAt: '$users.updatedAt'
        }
      }
    }
  }

Теперь я могу легко сделать $ slice в $ project оператор.

{
    $project: {
      _id: '$_id._id',
      users: {
        $slice: [
          "$users",
          skip,
          limit
        ]
      }
    },
  }

Если у кого-то есть лучшее решение, я хотел бы знать.

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