2017-01-02 43 views
0

在我的應用程序中,我有一個存儲用戶的模型。每個用戶可以阻止其他用戶,所以我創建了這個模型持有阻止用戶ID的條目:如何修改我的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節點。你能幫助我嗎?

回答

0

所以你可以使用Array.map得到的ID後你得到的結果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

謝謝你的這個答案,我想,和代碼工作沒有任何錯誤或錯別字:)不過,我不知道在輸出json中看到「is_anonymous」標誌,它只包含所有'用戶'的細節......還有什麼可能讓你想到我可以嘗試嗎? – user3766930

+0

嗯現在當我在想 - 這可能是因爲我的用戶模型中沒有實際的字段'is_anonymous' - 你認爲這可能是原因嗎? – user3766930

+0

@ user3766930我在代碼中更改了forEach循環。 – Molda