簡體   English   中英

如何修改我的mongodb / mongoose查詢,使其返回更詳細的json?

[英]how can I modify my mongodb/mongoose query so that it returns more detailed json?

在我的應用程序中,我有一個用於存儲用戶的模型。 每個用戶都可以阻止其他用戶,因此我在此模型中創建了一個條目,其中包含被阻止用戶的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節點上。 你能幫我嗎?

因此,您可以使用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);
    });
}

我沒有嘗試過這段代碼,所以期待一些錯誤或錯別字:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM