在我的应用程序中,我有一个用于存储用户的模型。每个用户都可以阻止其他用户,因此我在此模型中创建了一个条目,其中包含被阻止用户的ID:
...
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 :(得分: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);
});
}
我还没有尝试过这段代码,所以期待一些错误或错别字:)