【问题标题】:nodejs mongodb object id to stringnodejs mongodb对象ID到字符串
【发布时间】: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转成字符串呢?

【问题讨论】:

标签: node.js mongodb mongoose


【解决方案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)

              【讨论】:

                猜你喜欢
                • 2019-05-25
                • 1970-01-01
                • 1970-01-01
                • 2021-12-07
                • 2020-11-27
                • 2020-09-07
                • 1970-01-01
                • 2018-03-06
                • 1970-01-01
                相关资源
                最近更新 更多