Как я могу изменить мой запрос mongodb/mongoose, чтобы он возвращал более подробный JSON?

В моем приложении у меня есть модель для хранения пользователей. Каждый пользователь может блокировать других пользователей, поэтому в этой модели я создал запись, содержащую идентификаторы заблокированных пользователей:

...
blocked_user_ids: {type: [String]},
...

Я также создал конечную точку, которая позволяет мне получить список заблокированных пользователей для данного user_id, Поскольку я хотел, чтобы данные каждого пользователя были в этом списке, я должен был выполнить следующие запросы:

usersRoutes.get('/:id/blockedUsers/', functions.validateRequestsGET, function(req, res){
    var userId = req.params.id;

    async.auto({
        one: function(callback){
            findBlockedUsersIdsOfGivenUser(userId, callback);
        },
        two: ['one', function(callback, results){
            getBlockedUsersDetails(results.one, callback);
        }],
        final: ['one', 'two', function(callback, results) {
            res.status(200).send(results.two);
        }],
    }, function(err) {
        if (err) {
            sendError(res, err);
            return;
        }
    });
});

function findBlockedUsersIdsOfGivenUser(userId, callback) {
    var query = User.findOne({_id: userId}).select("blocked_user_ids");
    query.exec(function(err, blockedUsersIds){
        if(err) {
            return callback(err);
        }

        return callback(null, blockedUsersIds.blocked_user_ids);
    });
}

function getBlockedUsersDetails(blockedUsersIds, callback) {
    var query = User.find({_id: {$in: blockedUsersIds}});
    query.exec(function(err, blockedUsersDetails) {
        if(err) {
            return callback(err);
        }

        return callback(null, blockedUsersDetails);
    });
}

Это сработало и вернуло мне json, где каждый узел json содержал информацию о конкретном пользователе.

Однако, теперь моя модель изменилась, в настоящее время я должен был изменить массив строк в структуру:

...
blocked_user_ids: [{
    user_id: {type: String, required: true},
    is_anonymous: {type: Boolean, required: true}
}],
...

и теперь, кроме получения информации о пользователе в моем json, мне нужно изменить свои запросы так, чтобы вывод json содержал информацию о флаге is_anonymous - Я хочу добавить значение этого флага для каждого узла json, который представляет каждого пользователя. Вы можете помочь мне с этим?

1 ответ

Таким образом, вы можете получить идентификаторы, используя Array.map, и после получения результата добавьте свойство is_anonymous для каждого пользователя.

function getBlockedUsersDetails(blockedUsersIds, callback) {
    // get all ids and also create users object for easier assigning of `is_anonymous` property
    var users = {};
    var ids = blockedUsersIds.map(function(a){
        users[a.user_id] = a.is_anonymous;
        return a.user_id;
    });
    // ids is same array you previously had as blockedUsersIds
    var query = User.find({_id: {$in: ids}});
    query.exec(function(err, blockedUsersDetails) {
        if(err) {
            return callback(err);
        }

        //blockedUsersDetails.forEach(function(user, index){            
            //user.is_anonymous = users[user.user_id];
        //});

        blockedUsersDetails.forEach(function(user, index){            
            blockedUsersDetails[index].is_anonymous = users[user.user_id];
        });

        return callback(null, blockedUsersDetails);
    });
}

Я не пробовал этот код, так что ожидайте ошибок или опечаток:)

Другие вопросы по тегам