Node.js中将MongoDB的ObjectId转换为字符串

104

在 Node.js 中,使用 MongoDB 和 Mongoosejs 作为 orm

我正在做这件事

我有一个名为 User 的模型

User.findOne({username:'someusername'}).exec(function(err,user){
console.log(user) //this gives full object with something like {_id:234234dfdfg,username:'someusername'}
//but

console.log(user._id) //give undefined.
})

为什么?如何将_id转换为字符串?

1
请注意,在使用.toString()的答案仅适用于mongoose,而不适用于任何原生的mongodb驱动程序(根据2.2版本,您必须使用.toHexString())。 - UpTheCreek
1
使用mongojs驱动,.toString()也适用于我。 - Pritam Karmakar
https://docs.mongodb.com/manual/reference/method/ObjectId.toString/ - mvladk
14个回答

170

试试这个:

user._id.toString()

MongoDB ObjectId 是一个12字节的 UUID,可以用24个字符的 HEX 字符串表示。您需要将其转换为字符串并使用 console.log 在控制台中显示它。

因此,您需要执行以下操作:

console.log(user._id.toString());

2
请注意,这只适用于使用mongoose的情况 - 在mongodb中不支持此功能。 - UpTheCreek
@UpTheCreek,不,我只使用了MongoDB。我在这里使用了它:https://github.com/IonicaBizau/NodeJS-Beginner-Projects/tree/master/people-information-db。 - Ionică Bizău
自Mongo 2.2版本以来,它做了一些其他的事情。请参阅文档:http://docs.mongodb.org/manual/reference/method/ObjectId.toString/ 我猜你可能正在使用旧版本的mongodb? - UpTheCreek
不,我使用的是Mongo 2.4.4,我的项目仍然可以正常工作。刚刚测试过。 - Ionică Bizău
1
可以确认,使用mongodb2.4和mongoskin(使用mongo-native驱动程序)的我的应用程序无法正常工作。在mongo shell中键入(new ObjectId().toString())进行检查-您会得到一个字符串,但它不仅仅是十六进制字符串。 - UpTheCreek
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/32498/discussion-between-john--and-upthecreek - Ionică Bizău

30

把下划线去掉再试一遍:

console.log(user.id)

此外,从 id 返回的值已经是字符串了,你可以在这里看到。


5
请注意,这种方法不适用于mongoose@4.6.8版本。 - writofmandamus
哈,我刚刚在下面发了同样的东西 @writofmandamus 在5.4.19上运行得很好。 - Peter the Russian

24

我正在使用 mongojs,并且有这个示例:

db.users.findOne({'_id': db.ObjectId(user_id)  }, function(err, user) {
   if(err == null && user != null){
      user._id.toHexString(); // I convert the objectId Using toHexString function.
   }
})

19

试一试:

objectId.str;

查看文档


3
如果有更多的上下文,这将是完美的答案。 - Mathias
这里链接的文档没有提到ObjectId类型对象的str属性。然而,它确实描述了ObjectId.toString()方法,据我所知,这是最好的答案。 - Cutler.Sheridan

10

如果你正在使用Mongoose,确保id为十六进制字符串的唯一方法似乎是:

object._id ? object._id.toHexString():object.toHexString();

这是因为只有在对象被填充时,才存在object._id,如果未填充,则该对象是一个ObjectId。


4

使用mongoose时,通常表示_id的形式为(客户端接收)

{ _id: { _bsontype: 'ObjectID', id: <Buffer 5a f1 8f 4b c7 17 0e 76 9a c0 97 aa> },

可以看到其中有一个缓冲区。最简单的转换方法是使用<obj>.toString()String(<obj>._id)

例如:

var mongoose = require('mongoose')
mongoose.connect("http://localhost/test")
var personSchema = new mongoose.Schema({ name: String })
var Person = mongoose.model("Person", personSchema)
var guy = new Person({ name: "someguy" })
Person.find().then((people) =>{
  people.forEach(person => {
    console.log(typeof person._id) //outputs object
    typeof person._id == 'string'
      ? null
      : sale._id = String(sale._id)  // all _id s will be converted to strings
  })
}).catch(err=>{ console.log("errored") })

我不这么认为。那是返回给我的[object Object] - C-lio Garcia

2
function encodeToken(token){
    //token must be a string .
    token = typeof token == 'string' ? token : String(token)
}

User.findOne({name: 'elrrrrrrr'}, function(err, it) {
    encodeToken(it._id)
})

在mongoose中,objectId是一个对象(console.log(typeof it._id)).

2

1
如何全局转换它们? - Normal

0

find 返回的结果是一个数组。

尝试使用以下代码:

console.log(user[0]["_id"]);

1
如果使用的是 find,那么这个说法就是正确的,但是现在用的是 findOne - JohnnyHK
这确实可以使用 find。我花了两个小时才找到这个信息。谢谢。 - samurai_jane
OR console.log(user[0]._id); - user6363467

0

像这样访问对象ID中的属性:user._id.$oid


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接