35

我有一种方法可以根据其 ObjectID 在我的数据库中查找文档:

      console.log('id: ' + id + ' type: ' + typeof id);
      collection.findOne({'_id':new ObjectID(id)}, function(error,doc) {
        if (error) {
          callback(error);
        } else {
           callback(null, doc);
        }
      });

当我运行它时,我收到以下错误:

/myPath/node_modules/monk/node_modules/mongoskin/node_modules/mongodb/lib/mongodb/connection/base.js:245
    throw message;      
          ^
Error: Argument passed in must be a single String of 12 bytes or a string of 24 hex characters
at new ObjectID (/myPath/node_modules/mongodb/node_modules/bson/lib/bson/objectid.js:38:11)
at /myPath/collectionDriver.js:134:41

这指的是collection.findOne()上面的行。

我在该调用之前拥有的控制台日志将 id 输出为 24 个十六进制字符的字符串:

id: "55153a8014829a865bbf700d" type: string

在此之前,我使用将 id 从对象转换为字符串,JSON.stringify()但它似乎可以成功工作,如我的 console.log 所示。

在 Robomongo 中运行db.myCollection.findOne({_id : ObjectId("55153a8014829a865bbf700d")})会带来预期的结果。

4

14 回答 14

34

在这种情况下,传入我的函数的 id 已经是对象 ID,因此不需要从中创建新的 ObjectID。

当 ObjectID 注销到控制台时,它们显示为十六进制字符串,而不是ObjectID("hexString"),所以我认为我需要将其转换为查找,但它已经是我需要的格式。

于 2015-05-06T08:51:30.170 回答
5

试试这个:

var hex = /[0-9A-Fa-f]{6}/g;
id = (hex.test(id))? ObjectId(id) : id;
collection.findOne({'_id':new ObjectID(id)}, function(error,doc) {
  if (error) {
    callback(error);
  } else {
    callback(null, doc);
  }
});
于 2016-09-08T05:14:48.670 回答
4

就我而言,这有效:

var myId = JSON.parse(req.body.id);
    collection.findOne({'_id': ObjectID(myId)}, function(error,doc) {
    if (error) {
      callback(error);
    } else {
       callback(null, doc);
    }
});

不要忘记在开头包括:

var ObjectId = require('mongodb').ObjectID;
于 2016-11-08T00:15:36.500 回答
2

是的,我只是为此困惑了三十分钟。如果有人发现自己在这里,首先检查您是否需要首先转换为 ObjectID。像 OP 一样,我忘记了十六进制字符串就是这样记录的 - 一个十六进制字符串。

于 2020-05-23T02:09:39.537 回答
1

尝试ObjectID(id)而不是new ObjectID(id)

于 2015-05-05T11:12:32.170 回答
0

我遇到了同样的问题,但修剪传递给 ObjectId() 的 productId 对我有用

早些时候:

    const objectId = new ObjectID(productId);
    product = await db?.collection('products').find({ _id: objectId }).next();

现在:

    const objectId = new ObjectID(productId.trim());                                       
    product = await db?.collection('products').find({ _id: objectId }).next();
于 2021-02-23T06:20:57.370 回答
0

我找到了这个的来源,

确保该值不能有任何空格,

您可以使用 const ID = id.trim(); then use ObjectId(ID)

谢谢快乐编码

于 2021-04-24T18:04:00.803 回答
0

如果您收到此错误,则传入的参数必须是 24 个十六进制字符的字符串。就这样做

使用 .trim() 删除任何多余的字符,通常会在 id 中添加一个空格。它变成 25 hex charater 。所以不是 _id = yourId; 使用 _id = yourId.trim()

于 2021-05-06T03:44:52.127 回答
0

collection.find({ _id: { $in: req.body.map(pd => ObjectId(pd)) } })

使用-- 它对我map()有用。res.body

于 2021-05-19T22:26:59.253 回答
0
const ID = (req.body.id).trim();

为我工作,实际上(req.body.id)为 ID 变量增加了一个额外的空间。

在我使用.trim()方法后它起作用了。

于 2021-07-17T06:10:36.063 回答
0

我已经尝试了所有答案。但这对我不起作用。也许如果您使用 express 获取参数。它对我有用。试试这个;

var MongoClient = require('mongodb').MongoClient;
const {ObjectId} = require('mongodb');

app.get('/:id', (req, res) => {

var reqId = req.params.id
var query = reqId.toString()


MongoClient.connect(url, function(err, db) {
    if (err) throw err;
    var dbo = db.db("AllDB");
    dbo.collection("Events").findOne({_id: ObjectId(query)}, function(err, result) {
        if (err) throw err;
        res.send(result)
        db.close();
      });
});

})

更新 :

嘿,我再次给出同样的错误,我注意到新的解决方案。如果你的代码是这样的:

app.get('/', (req, res) => {
    res.send('TEST')
})


app.get('/:id', (req, res) => {

   var reqId = req.params.id
   var query = reqId.toString()

})

您能否尝试更改您的获取请求路线。也许比如 app.get('/findid/:id)

它对我有用。我再次搜索,我找到了这种方式。

感谢和问候。

于 2022-02-05T17:45:41.990 回答
0

我得到了同样的错误。后来我发现我在将值发送到服务器时包含了一个空格。

<input type="checkbox" name="checkbox" value="<%= item._id %>" onchange="this.form.submit()" />
  

在我输入的 value 属性中value="<%= item._id %> " 。ID 后面的空格。它导致了那个错误。在我删除它(value="<%= item._id %>" )之后,问题就解决了。

下面的代码对我有用。

item.findOne({'_id':id} , (err)=>{

if(err){
  console.log(err);
}
else{
  console.log("Item Found");
}

});

于 2022-02-06T08:47:11.823 回答
0

实际上,您要获取的 Id 中有空格,因此将 trim() 添加到您的 id 将起作用

const id = (req.params.id).trim();
const result =  await deleteOne({_id:new mongodb.ObjectId(id)});

在使用此代码时请记住,您的函数应该是异步的,并且应该已经导入了 mongodb。

于 2022-02-11T07:24:57.413 回答
0

将 id 的类型从 string 转换为 mongoose objectID(默认为 _id)。

collection.findOne({'_id':new mongoose.Types.ObjectID(id)}, function(error,doc) {
于 2022-02-28T17:50:18.347 回答