Node.js,MongDB(Mongoose) - 添加到检索的数据。

时间:2015-06-13 10:54:06

标签: javascript node.js mongodb mongoose

我目前有以下代码:

User.find({ featuredMerchant: true })
.lean()
.limit(2)
.exec(function(err, users) {
    if (err) {
        console.log(err);
        return res.status(400).send({
            message: errorHandler.getErrorMessage(err)
        });
    } else {
        _.forEach(users, function(user){
            _.forEach(user.userListings, function(listing){
                Listing.find({
                    user: user
                }).populate('listings', 'displayName merchantName userImageName hasUploadedImage').exec(function(err, listings){
                    user.listings = listings;
                });
            });
        });
        res.jsonp(users); 
    } 
});

正如您所看到的,我正在尝试将检索到的商家信息添加到每个“用户”中。在'用户'我回来的精益物体。如果我在添加' user.listings = listing'之后在Listing.find exec方法中执行了console.log(user),结果就像我期望的那样;具有listing属性的用户对象,该listing属性包含检索到的所有列表。

但是,如果我在console.log中使用'用户'对象,找不到每个用户的列表。

我很确定我在这里做了些蠢事,但我真的无法解决问题。任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:0)

你对愚蠢的事情是对的!

没有冒犯,我认为这是一个常见的错误:)

_.forEach(users, function(user){
    _.forEach(user.userListings, function(listing){
        Listing.find({
            user: user
        })
        .populate('listings', 'displayName merchantName userImageName hasUploadedImage')
        .exec(function(err, listings){
            user.listings = listings;
        });
     });
});
// Listing.find inside foreach hasn't finish yet
// I suppose it's always an asynchronous call
res.jsonp(users);

也许你可以使用promises来修复它。这是q库的一个例子。

var promises = [];
_.forEach(users, function(user){
    _.forEach(user.userListings, function(listing){
        var deferred = q.defer();
        promises.push(deferred);
        Listing.find({
            user: user
        })
        .populate('listings', 'displayName merchantName userImageName hasUploadedImage')
        .exec(function(err, listings){
            user.listings = listings;
            deferred.resolve(user);
        });
     });
});

q
    .all(promises)
    .done(function(allUsers){
        // Do what you want here with your users
        res.jsonp(allUsers);    
    });

检查一下,不要犹豫,因为我无法对其进行测试。

答案 1 :(得分:0)

感谢您的投入。真的很感激。我设法解决这个问题更容易,现在我开始认为这很明显 - 但是我们生活和学习。基本上,我的'userListings'模型字段是Object Id的数组,我想将列表模型中的物理列表添加到返回的数据中。以下代码为我做了诀窍。

exports.findFeaturedMerchants = function(req, res, next) {

User.find({ featuredMerchant: true })
.populate('userListings')
.limit(2)
.exec(function(err, data) {
    _.forEach(data, function(user){
        Listing.populate(user.userListings, '', function(err, user){
            if (err) {
                console.log(err);
                return res.status(400).send({
                    message: errorHandler.getErrorMessage(err)
                });
            }
        });
    });
    console.log(data);
    res.jsonp(data); 
});
};

我只需要将每个userListings对象填充到用户中,方法是使用populate函数两次 - 一次用于用户,另一次用于每个列表。我发现很难理解 - 可能是因为我不明白填充函数是如何工作的,但是我们去了:)

杰米