在MongoDB中,使用一个ID数组获取集合中的对象

3
使用node.js / express和mongoDB构建API。我有两个集合,一个是用户,一个是项目,它们之间是多对多的关系。我想获取用户正在关注的所有项目。用户项目是一个包含指向项目的ID的数组。
如何查询以获取在用户项目数组中的所有项目?
集合:
- 用户:
{
    email: "johnny@hotmail.com",
    username: "johnny",
    useritems: ["51e101df2914931e7f000003", "51cd42ba9007d30000000001"]
}

物品:

{
       "name": "myitem",
       "description": "Description of item" 
       "_id": "51e101df2914931e7f000003"
}

{
       "name": "myitem2",
       "description": "Description of item2" 
       "_id": "51cd42ba9007d30000000001"
}

{
       "name": "myitem3",
       "description": "Description of item3" 
       "_id": "51e101df2914931e7f000005"
}

编辑:

我更新了代码。现在根据用户id获取用户项id的数组。问题是当我尝试将项目发送到数组时,始终为空。我的查询有问题吗?

exports.findItemsByUserId = function(req, res) {
    //var id = req.params.id;

   var userId = "51e6a1116074a10c9c000007"; //Just for testing

    db.collection('users', function(err, collection) {
        collection.findOne({'_id':new BSON.ObjectID(userId)}, function(err, user) {

            db.collection('items', function(err, collection) {

                console.log("user undefined? ",user);
                console.log("useritems ",user.useritems);
                collection.find({'_id': {'$in' : user.useritems}}).toArray(function(err, items) {
                    console.log("useritems ",user.useritems); // <--Gets me array with the ids
                    console.log("items ", items); //<--Empty
                    res.send(items);//Empty
                });
            });
        });
    });
};
2个回答

1
也许这更接近实际情况了?
exports.findItemsByUserId = function(req, res) {
  var userId = "51e101df2914931e7f000003"; //Just for testing
  var user = db.users.find({"_id": userId});

  var items = db.items.find({'_id': {'$in' : user.useritems}});
  res.send(items.toArray());
};

那不起作用。我对mongoDB和nosql数据库很新。例如,在MySql中,我只需创建一个带有userid和itemid作为外键的useritems表。但是我无法让这些关系在mongoDB中起作用。 - Bullfinch
仍然出现 TypeError: Cannot call method 'find' of undefined。 - Bullfinch
什么行?你只在“users”和“items”集合上调用了“find”,因此其中一个对象是未定义的...JavaScript区分大小写,你有时会将它们大写... “console.log”非常有帮助,可以在程序不同点显示对象的内容。 - sje397
我更新了我的代码。Console.log正在帮助我。现在的问题是,items总是为空。我的查询是否获取所有ID项的数组有误? - Bullfinch
我认为您想将回调函数作为find方法的第二个参数,而不是作为'toArray'函数的参数。 - sje397

0
问题已解决。虽然不是最高级的解决方案,但它能够正常工作。只需循环遍历一些数组即可。猜测可能有一些适当的查询方法。
exports.findItemsByUserId = function(req, res) {
   var id = req.params.id; //<--- was disabled, it will give an error when testing this code.

   var userId = "51e6a1116074a10c9c000007"; //Just for testing

    db.collection('users', function(err, collection) {
        collection.findOne({'_id':new BSON.ObjectID(id)}, function(err, user) {

            db.collection('items', function(err, collection) {
                var itemsArray = []

                var itemIds = user.useritems

                for (var i = 0; i < itemIds.length; i++) {
                    itemIds[i]

                    collection.findOne({'_id':new BSON.ObjectID(itemIds[i])}, function(err, item) {

                    itemsArray.push(item);

                    if(itemIds.length === itemsArray.length){

                        res.send(itemsArray);

                    }

                    });
                };

            });
        });
    });
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接