为什么我的查询对象无法正确使用_id?

时间:2014-08-03 03:21:12

标签: node.js mongodb http express

我尝试使用Express和MongoDB编写Node.js Web API。我从GET请求动态解析req.query对象(Express&#39s的查询字符串存储/解析器)并更新名为" query"的对象。使用查询字符串对,我可以在数据库集合中找到与查询字符串参数匹配的文档。例如,a localhost:3000 // users?name = John& last = Smith将修改查询对象,以便我们只查找名称字段为John,最后一个字段为Smith的记录。我们也可以不发送这些参数,只发送一个或更多。问题是当我尝试发送这样的查询字符串时:

localhost:3000 //用户?_id = 1

这什么都不返回。当我使用终端(windows cmd)直接访问数据库并运行此查询(db.Users.find({_ id:1}))时,它工作正常并按预期返回。此外,console.log(query._id)返回1,所以我知道对象正在存储我期望的参数。

var query = {};
//Iterate through query string parameters as a Get request
//Add them to the query object, (add them as object properties)
for(var propName in req.query) {
    query[propName] = req.query[propName];
}
db.collection("Users", function(err, collection) {
        if(!err) {
            collection.find(query, {limit: 100},function(err, cursor) {
                if(!err) {
                    cursor.toArray(function(err, arr) {
                        if(!err) {
                            console.log(arr);
                            res.send(arr);
                        } else {
                            console.log("Failed to turn cursor to array: "+err);
                        }
                    });
                } else {
                    console.log("Find failed: "+err);
                }
            });
        } else {
            console.log("Failed opening collection: "+err);
        }
    });

1 个答案:

答案 0 :(得分:3)

这是因为MongoDB文档中的_id值是1,但是您使用字符串'1'查询它(所有req.query字段都是字符串)。

可能的解决方案是将字段解析为数字:

if (propName === '_id') {
    query[propName] = parseInt(query[propName], 10);
}

或者使用像Mongoose这样的东西,它会根据模式定义为你做这种渲染。