NodeJS + MongoDB:使用findOne()从集合中获取数据

f1n*_*1nn 16 mongodb node.js express

我有一个集合"公司"与几个对象.每个对象都有"_id"参数.我正试图从db获取此参数:

app.get('/companies/:id',function(req,res){
db.collection("companies",function(err,collection){
    console.log(req.params.id);
    collection.findOne({_id: req.params.id},function(err, doc) {
        if (doc){
            console.log(doc._id);
        } else {
            console.log('no data for this company');
        }
    });
});
});
Run Code Online (Sandbox Code Playgroud)

所以,我要求公司/ 4fcfd7f246e1464d05000001(4fcfd7f246e1464d05000001是我需要的对象的_id-parma)并且findOne什么都不返回,这就是'为什么console.log('没有这家公司的数据'); 执行.

我绝对相信我有一个_id ="4fcfd7f246e1464d05000001"的对象.我做错了什么?谢谢!

但是,我刚刚注意到id不是典型的字符串字段.这就是mViewer所展示的:

"_id": {
        "$oid": "4fcfd7f246e1464d05000001"
    },
Run Code Online (Sandbox Code Playgroud)

似乎有点奇怪......

Ada*_*ord 20

您需要构造ObjectID而不是将其作为字符串传递.这样的事情应该有效:

var BSON = require('mongodb').BSONPure;
var obj_id = BSON.ObjectID.createFromHexString("4fcfd7f246e1464d05000001");
Run Code Online (Sandbox Code Playgroud)

然后,尝试在find/findOne中使用它.

编辑:正如Ohad在评论中指出的那样(感谢Ohad!),你也可以使用:

new require('mongodb').ObjectID(req.params.id)
Run Code Online (Sandbox Code Playgroud)

而不是createFromHexString如上所述.

  • 你可以使用"new require('mongodb').ObjectID(req.params.id)"而不是createFromHexString (4认同)