【问题标题】:Get objects in a collection with an array of id's in mongoDB使用 mongoDB 中的 id 数组获取集合中的对象
【发布时间】:2013-07-17 12:26:54
【问题描述】:

使用 node.js/express 和 mongoDB 构建 API。我有两个具有多对多关系的集合,用户和项目。我想获取用户关注的所有项目。用户 Items 是一个数组,其 id 引用 Items。

如何查询才能得到 useritems 数组中的所有项目?

收藏:

用户:

{
    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
                });
            });
        });
    });
};

【问题讨论】:

    标签: node.js mongodb express data-modeling


    【解决方案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 中,我将创建一个 useritems 表,其中 userid 和 itemid 作为外键。但我无法让这些关系与 mongoDB 一起使用
    • 仍然得到; TypeError:无法调用未定义的方法“查找”
    • 哪一行?你只在你的'users'和'items'集合上调用find,所以其中一个对象是未定义的......JavaScript是区分大小写的,有时你会大写它们......console.log对于显示内容非常有帮助程序中不同点的对象。
    • 我更新了我的代码。 Console.log 正在帮助我。现在的问题是项目总是空的。我的查询是否要从 id 错误的数组中获取所有项目?
    • 我认为您希望回调函数作为 find 方法的第二个参数 - 而不是作为“toArray”函数的参数。
    【解决方案2】:

    问题解决了。不是最花哨的解决方案,但它有效。只是循环一些数组。猜猜这有一些适当的查询。

    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);
    
                        }
    
                        });
                    };
    
                });
            });
        });
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多