Возврат полей из другой коллекции Mongoose - PullRequest
0 голосов
/ 06 сентября 2018

Представьте себе функцию, которая находит пользователей по их имени и возвращает их.

 User.aggregate(
        [
            { $sort: { userFirstName: 1, userLastName: 1 } },
            {
                $addFields: {
                    firstLastName: { $concat: ['$userFirstName', ' ', '$userLastName'] },
                    lastFirstName: { $concat: ['$userLastName', ' ', '$userFirstName'] }
                }
            },
            {
                $match: $match // Set from above with match crit
            },
            {
                $group: {
                    _id: null,
                    total: { $sum: 1 },
                    data: {
                        $push: {
                            '_id': '$_id',
                            'userFirstName': '$userFirstName',
                            'userLastName': '$userLastName',
                            'userProfileImage': '$userProfileImage',
                            'userVihorCategory': '$userVihorCategory'
                        }
                    }
                }
            },
            {
                $project: {
                    total: 1,
                    data: { $slice: ['$data', start, limit] }
                }
            }
        ]
    ).exec((errAgg, results) => {...

Это работает, соединяет их и возвращает их правильно. Существует еще одна коллекция, которая отслеживает подключения пользователей.

{
    user: { type: Schema.Types.ObjectId, ref: 'User' },
    userConnection: { type: Schema.Types.ObjectId, ref: 'User' },
    userConnectionStatus: {
        type: String,
        enum: ['following', 'blocked', 'requested']
    }
}

Например, пользователь: я, userConnection: «кто-то», userConnectionStatus: «следующий»

Я пытаюсь вернуть еще 2 поля, 1. Мой userConnectionStatus к нему 2. Его пользовательское СоединениеСтатус ко мне

И не возвращать пользователей, которые заблокировали меня. Каков наилучший подход, когда дело доходит до этой структуры БД.

Спасибо, что уделили время

1 Ответ

0 голосов
/ 06 сентября 2018

Предотвращение заблокированных пользователей было решено путем выбора всех заблокированных пользователей и добавления $ nin в совпадении в совокупности.

Для статуса подключения я решил проблему, добавив 2 виртуальных поля для пользователя.

UserMongoSchema.virtual('userConnectionStatus', {
  ref: 'UserConnection',
  localField: '_id',
  foreignField: 'user',
  justOne: true
});
UserMongoSchema.virtual('connectionStatus', {
  ref: 'UserConnection',
  localField: '_id',
  foreignField: 'userConnection',
  justOne: true
});

И заполнение их по результатам

...
.exec((errAgg, results) => {
      User.populate(results[0].data, [ 
            { path: 'userConnectionStatus', match: { userConnection: req.userCode }, select: 'userConnectionStatus' },
            { path: 'connectionStatus', match: { user: req.userCode }, select: 'userConnectionStatus' },
        ], (errPop, populateResponse) => {
            if (errPop) { return next(errPop); }

            populateResponse = populateResponse.map((row) => {
                row['userConnectionStatus'] = row.userConnectionStatus ? row.userConnectionStatus.userConnectionStatus : null;
                row['connectionStatus'] = row.connectionStatus ? row.connectionStatus.userConnectionStatus : null;
                return row;
            });
...

Глядя на порядок действий, я думаю, что это не повлияет на производительность, так как я выполняю заполнение только тех результатов, которые соответствуют X (максимум 100).

Я пока не буду отмечать это как Ответ. Если у вас есть мнение о том, является ли это плохой практикой или есть лучший способ сделать это, не стесняйтесь комментировать.

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