13

如果我有一个 mongo 文档 id 作为字符串,我如何将它作为 _id 查询?

它会正常工作.find({_id:'stringID'})还是我需要先将其转换为 bson 对象?

4

3 回答 3

29

你的意思是你有一个ObjectId的24个十六进制数字字符串?

假设这就是您的意思,大多数驱动程序都有办法获取字符串并将其转换为 ObjectId。在 JavaScript 中是:

.find({_id:new ObjectId("4f91bfcfaa7c5687a0c686d4")})

更新后对节点原生驱动程序更有用(来自https://github.com/christkv/node-mongodb-native的文档):

// Get the objectID type
var ObjectID = require('mongodb').ObjectID;

var idString = '4e4e1638c85e808431000003';
collection.findOne({_id: new ObjectID(idString)}, console.log)  // ok
collection.findOne({_id: idString}, console.log)  // wrong! callback gets undefined
于 2012-04-20T22:35:02.683 回答
2

如果您的 _id 值是字符串,您可以像查询任何其他字段一样查询它们。(请记住,如果您为 _id 设置自定义值,它们必须保持唯一,否则您将收到重复键错误。)

这是 Mongo JS Shell 中的一个示例:

> db.test.insert({_id:"stringID1"})
> db.test.insert({_id:"stringID2"})
> db.test.insert({_id:"stringID3"})
> db.test.find({_id:"stringID1"})
{ "_id" : "stringID1" }
> 

这是你要找的吗?我希望我没有误解你的问题!

于 2012-04-20T22:08:51.807 回答
1

Mongoose 使用时会自动将字符串转换_id为 ObjectId findByID,因此您可以使用字符串进行查询_id

还请记住,任何输入到您的 API 的输入都来自req.bodyreq.params都将是类型字符串,因此您需要在需要时输入强制类型转换...,但如前所述,猫鼬会为您执行此操作,因此您可以保留_id它进来的字符串格式作为。

于 2020-05-08T16:09:37.817 回答