如何修改我的 mongodb/mongoose 查询,使其返回更详细的 json?
Posted
技术标签:
【中文标题】如何修改我的 mongodb/mongoose 查询,使其返回更详细的 json?【英文标题】:how can I modify my mongodb/mongoose query so that it returns more detailed json? 【发布时间】:2017-05-16 20:59:58 【问题描述】:在我的应用中,我有一个用于存储用户的模型。每个用户都可以屏蔽其他用户,所以我在这个模型中创建了一个条目来保存被屏蔽用户的 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
的信息 - 我想将该标志的值添加到代表每个用户。你能帮我解决这个问题吗?
【问题讨论】:
【参考方案1】:因此您可以使用 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);
);
我没有尝试过这段代码,所以预计会有一些错误或拼写错误:)
【讨论】:
谢谢你的回答,我试过了,代码没有任何错误或拼写错误:) 但是,我在输出 json 中没有看到标志is_anonymous
,它只包含所有 @987654323 @详细信息...您还有什么可以尝试的吗?
嗯,现在当我在想的时候——可能是因为我的用户模型中没有 is_anonymous
的实际字段——你认为这可能是原因吗?
谢谢,我试过了,但是即使在我的数据库中我存储:"blocked_user_ids" : [ "is_anonymous" : true, "user_id" : "58...88c0", "_id" : ObjectId("586ab...c3") , "is_anonymous" : false, "user_id" : "586....8c0", "_id" : ObjectId("58...7a98a") ]
,我仍然看到单个条目 json 作为输出,即使在那里,标志 is_anonymous
是不存在 :(
我还意识到在输出 json 字段中缺少 user_id
,我不确定该信息是否在这里至关重要以上是关于如何修改我的 mongodb/mongoose 查询,使其返回更详细的 json?的主要内容,如果未能解决你的问题,请参考以下文章
mongoDB (mongoose增删改查聚合索引连接备份与恢复监控等等)
如何使用 mongoose 将我的收藏放在 mongoDB 中?