javascript - 数组在 Nodejs 和 MongoDB 中使用 forEach 循环返回空值

标签 javascript jquery arrays node.js mongodb

我正在使用 Nodejs、MongoDB 和 Express 进行编码。下面的代码在 MongoDB 中查找具有特定 id 的用户对象。找到用户对象后,它会检索该对象的 favorite 属性。 favorite 属性是一个数组,其每个元素都是产品的 _id。我试图遍历这个数组。在每个循环中,我尝试从 MongoDB 检索一个产品对象并将该产品对象附加到新数组(在我下面的代码中它称为“列表”)。我放了一些 console.log() 来检查列表的值。它在每个循环中都有值(value),但最后当我得到最后一个循环时,它为空。我知道问题的发生是因为我没有正确使用 deferred.resolve 和 deferred.promise。请帮助我并解释 deferred.resolve 和 deferred.promise 在代码中的工作原理。非常感谢

function showBasket(user) {
var deferred = Q.defer();
var list =[];
db.users.findById(user, function (err, user) {
    if (err) deferred.reject(err);
    if (user) {

        var favorite = user.favorite;
        favorite.forEach(function(e){
        db.products.findById(mongo.helper.toObjectID(e), function(err, product){

                  if (err) deferred.reject(err);
                  if (product) {  
                    list.push(product);   
                    console.log(list);// list has value here                                   
                }

            })//end db.products.findById   

        })//end of forEach

    } //end of if
    console.log(list);// But finally, list has null value here
    deferred.resolve(list); 
});//end of db.users.findById

return deferred.promise;
}

最佳答案

这是一个异步问题,但是你的forEach没有用,因为有$in运算符,它将获取字段值等于数组中任何值的所有文档:

db.products.find({
    "_id": {
        "$in": user.favorite
    }
}, function(err, products) {

    // here products is an array of product

    if (err) {
        console.log(err);
        deferred.reject(err);
    } else {
        console.log(products);
        deferred.resolve(products);
    }
})

结果是一组与 user.favorite 数组中所有 id 匹配的产品。如果您在 user.favorite 中的项目不是 ObjectId 类型,您可能需要在查询之前对每个项目执行 mongo.helper.toObjectID(item) :

var favoriteArr = [];

for (var i = 0; i < user.favorite.length;i++)[
    favoriteArr.push(mongo.helper.toObjectID(user.favorite[i]));
}
// use favoriteArr with $in operator

关于javascript - 数组在 Nodejs 和 MongoDB 中使用 forEach 循环返回空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42615878/

相关文章:

c++ - 按字母顺序然后按长度对字符数组进行排序

javascript - 如何建立像google+一样的拖放圈子系统

javascript - 提交前创建文本区域预览

javascript - 没有图例的图表图像

javascript - Css Hover div 没有按预期工作

javascript - 自动完成 - 自定义渲染项目/菜单和项目选择问题

JavaScript 描述符 : enumerable/configurable/writable are not true by default?

javascript - 上面显示 input.focus()

javascript - C3 条形图,条数未知

c++ - C++ 中数组对象的隐式类型转换