nodejs mongodb对象ID到字符串

Posted

技术标签:

【中文标题】nodejs mongodb对象ID到字符串【英文标题】:nodejs mongodb object id to string 【发布时间】:2012-10-17 18:25:27 【问题描述】:

在nodejs中,以mongodb、mongoosejs为orm

我正在这样做

我有一个模型,用户

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转成字符串呢?

【问题讨论】:

请注意,使用 .toString() 的答案仅适用于 mongoose,而不适用于任何本机 mongodb 驱动程序(根据 2.2,您必须使用 .toHexString() .toString() 也为我使用了 mongojs 驱动程序 docs.mongodb.com/manual/reference/method/ObjectId.toString 【参考方案1】:

试试这个:

user._id.toString()

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

所以,你必须这样做:

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

【讨论】:

请注意,这仅适用于 mongoose - mongodb 不支持此功能。 @UpTheCreek,不,我只将它与 MongoDB 一起使用。我用过here。 从 mongo 2.2 开始,它做了一些别的事情。请参阅文档:docs.mongodb.org/manual/reference/method/ObjectId.toString 我猜您一定在使用旧版本的 mongodb? 不,我使用 Mongo 2.4.4,我的项目仍然有效。一分钟前测试过。 可以确认它不适用于我使用 mongodb2.4 和 mongoskin(使用 mongo-native 驱动程序)的应用程序。通过在 mongo shell 中键入 (new ObjectId().toString()) 来检查 - 你会得到一个字符串,但它不仅仅是十六进制字符串。【参考方案2】:

去掉下划线再试一次:

console.log(user.id)

另外,从id返回的值已经是一个字符串,可以看到here。

【讨论】:

我只想指出,这不适用于 mongoose@4.6.8。 哈,我刚刚在@writofmandamus 下面发布了同样的内容,它在 5.4.19 上对我来说工作正常【参考方案3】:

我正在使用 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.
   
)

【讨论】:

【参考方案4】:

试试这个:

objectId.str;

见doc。

【讨论】:

再加一点上下文,这将是完美的答案。【参考方案5】:

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

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

这是因为 object._id 仅在对象被填充时才存在,否则对象是 ObjectId

【讨论】:

【参考方案6】:

使用猫鼬时。

_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]【参考方案7】:
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 是一个 object (console.log(typeof it._id))。

【讨论】:

【参考方案8】:

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

试试这个:

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

【讨论】:

如果使用了find,那将是正确的,但这是findOne 这确实适用于find。花了两个小时试图找到这些信息。谢谢。 或 console.log(user[0]._id);【参考方案9】:

user._id.$oid那样访问对象ID中的属性。

【讨论】:

【参考方案10】:

从 Mongoose 5.4 开始,您可以使用 SchemaType Getters 将 ObjectId 转换为 String。

见What's New in Mongoose 5.4: Global SchemaType Configuration。

【讨论】:

【参考方案11】:

使用String(user._id.$oid)真的很简单

【讨论】:

【参考方案12】:

试试这个:console.log(user._doc._id)

【讨论】:

以上是关于nodejs mongodb对象ID到字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在 javascript (ionic | Angular | NodeJS | MongoDB) 中将包含对象的数组展平和减少为逗号分隔的字符串

NodeJS 和 MongoDB - 根据 id 数组获取对象

如何在nodejs mongodb本机驱动程序中将字符串转换为ObjectId?

Spring数据mongodb过滤字符串集合中的嵌套对象ID

在嵌套数组 mongodb nodejs 中插入对象

使用 _id 字符串的 GraphQL 查询,对象 ID 存储在 MongoDB 中