如何修改我的 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 增删查改

mongoDB (mongoose增删改查聚合索引连接备份与恢复监控等等)

如何使用 mongoose 将我的收藏放在 mongoDB 中?

如何填充递归模式引用 Mongodb、Mongoose、Express?

MongoDB(Mongoose)更新数组数组中的元素

单链查询 mongodb / mongoose 获取所有评论