2017-01-02 7 views
0

В моем приложении у меня есть модель для хранения пользователей. Каждый пользователь может блокировать другие пользователь, поэтому я создал запись в этой модели, которая содержит идентификаторы заблокированных пользователей:Как я могу изменить свой запрос 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, мне нужно изменить мои запросы так, чтобы output json содержит информацию о флаге is_anonymous - Я хочу добавить значение этого флага в каждый json-узел, который представляет каждого пользователя. Можете ли вы мне помочь?

ответ

0

Таким образом, вы можете получить идентификаторы с помощью 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); 
    }); 
} 

Я не пробовал этот код поэтому ожидать некоторые ошибки или опечатки :)

+0

поблагодарить вас за этот ответ, я попробовал, что и код работал без каких-либо ошибок или опечаток :) Однако, я не см. флаг 'is_anonymous' в выходном json, он содержит только все данные' user' ... Есть ли что-то еще, что может прийти вам на ум, что я мог бы попробовать? – user3766930

+0

hm теперь, когда я думаю - возможно, потому, что у меня нет фактического поля 'is_anonymous' в моей модели пользователя - вы думаете, что это может быть причиной? – user3766930

+0

@ user3766930 Я изменил forEach цикл в коде. – Molda