【问题标题】:Convert ObjectID (Mongodb) to String in JavaScript在 JavaScript 中将 ObjectID (Mongodb) 转换为字符串
【发布时间】:2022-01-18 16:40:41
【问题描述】:

我想在 JavaScript 中将 ObjectID (Mongodb) 转换为 String。 当我得到一个对象形式的 MongoDB 时。它就像一个对象有:时间戳,秒,公司,机器。 我无法转换为字符串。

【问题讨论】:

  • ""+objectIdobjectId.toString() 其中 objectId 是我相信会满足您的需求的变量。
  • 从 MongoDB 加载的 ObjectID 是一个对象。如果你在 Javascript 中使用 toString() 函数,它将返回 [Object, Object]。
  • 奇怪,那些功能应该实现了,我确定已经修复了
  • 不知道谁将此标记为:stackoverflow.com/questions/8106517/mongodb-objectid-to-string 的副本,但您大错特错...
  • 我认为这不是一个坏问题。!您的链接用于 PHP。我需要它在 JavaScript 中。!

标签: javascript mongodb aggregation-framework


【解决方案1】:

试试这个:

objectId.str

请参阅doc

ObjectId()具有以下属性和方法:

[...]

  • str - 返回对象的十六进制字符串表示。

【讨论】:

  • 我不明白为什么,当我执行 console.log 时,这对我不起作用,我在控制台上看到 objectId 作为对象
  • 这对我也不起作用。但是,objectId.toString() 做到了。
  • objectId.str 用于 mongo shell,objectId.toString() 用于 mongo 客户端
【解决方案2】:

这是一个将ObjectId 转换为字符串的工作示例

> a=db.dfgfdgdfg.findOne()
{ "_id" : ObjectId("518cbb1389da79d3a25453f9"), "d" : 1 }
> a['_id']
ObjectId("518cbb1389da79d3a25453f9")
> a['_id'].toString // This line shows you what the prototype does
function () {
    return "ObjectId(" + tojson(this.str) + ")";
}
> a['_id'].str // Access the property directly
518cbb1389da79d3a25453f9
> a['_id'].toString()
ObjectId("518cbb1389da79d3a25453f9") // Shows the object syntax in string form
> ""+a['_id'] 
518cbb1389da79d3a25453f9 // Gives the hex string

尝试了各种其他功能,例如toHexString(),但均未成功。

【讨论】:

【解决方案3】:

shell

ObjectId("507f191e810c19729de860ea").str

在js中using the native driver for node

objectId.toHexString()

【讨论】:

  • 不错的答案,它指出了使用本机驱动程序的区别。
  • 如果您使用的是 NoSQLBooster 之类的客户端,就会出现这种情况。谢谢。
【解决方案4】:

您可以使用 mongodb 4.0 版本中引入的 $toString 聚合,它将 ObjectId 转换为字符串

db.collection.aggregate([
  { "$project": {
    "_id": { "$toString": "$your_objectId_field" }
  }}
])

【讨论】:

    【解决方案5】:

    使用 toString: var stringId = objectId.toString()

    适用于最新的 Node MongoDB Native 驱动程序 (v3.0+):

    http://mongodb.github.io/node-mongodb-native/3.0/

    【讨论】:

      【解决方案6】:

      其实你可以试试这个:

      > a['_id']
      ObjectId("518cbb1389da79d3a25453f9")
      > a['_id'] + ''
      "518cbb1389da79d3a25453f9"
      

      ObjectId 对象 + String 将转换为 String 对象。

      【讨论】:

        【解决方案7】:

        如果有人在 Meteorjs 中使用,可以试试:

        在服务器中:ObjectId(507f191e810c19729de860ea)._str

        在模板中:{{ collectionItem._id._str }}

        【讨论】:

          【解决方案8】:

          假设 OP 想要获取 ObjectId 的十六进制字符串值,使用 Mongo 2.2 或更高版本,valueOf() 方法将对象的表示形式返回为十六进制字符串。这也可以通过str 属性实现。

          anubiskong 帖子上的链接提供了所有细节,这里的危险是使用从旧版本改变的技术,例如toString().

          【讨论】:

            【解决方案9】:

            在 Javascript 中,String() 让它变得简单

            const id = String(ObjectID)
            

            【讨论】:

              【解决方案10】:

              这行得通,你有 mongodb 对象:ObjectId(507f191e810c19729de860ea), 要获取_id 的字符串值,您只需说

              ObjectId(507f191e810c19729de860ea).valueOf();
              

              【讨论】:

              • 请改进你的答案
              • 字符串被包裹在 ObjectId 中,所以要获得包裹的值,您可以使用我刚刚提供的答案@Ivan Barayev
              【解决方案11】:

              在 Js 中做简单:_id.toString()

              例如:

              const myMongoDbObjId = ObjectID('someId');
              const strId = myMongoDbObjId.toString();
              console.log(typeof strId); // string
              

              【讨论】:

              • 需要一些解释
              • @sidgate,添加了一个例子
              • 谢谢@Mar 这只是让我免于序列化错误。
              【解决方案12】:

              toString() 方法为您提供十六进制字符串,它是一种 ascii 代码,但在基数 16 数字系统中。

              将 id 转换为 24 个字符的十六进制字符串进行打印

              例如在这个系统中:

              "a" -> 61
              "b" -> 62
              "c" -> 63
              

              因此,如果您通过"abc..." 获得objectId,您将获得“616263...”。

              因此,如果您想从 objectId 获取可读字符串(char 字符串),您必须将其转换(hexCode 到 char)。

              为此,我编写了一个实用函数hexStringToCharString()

              function hexStringToCharString(hexString) {
                const hexCodeArray = [];
              
                for (let i = 0; i < hexString.length - 1; i += 2) {
                  hexCodeArray.push(hexString.slice(i, i + 2));
                }
              
                const decimalCodeArray = hexCodeArray.map((hex) => parseInt(hex, 16));
              
                return String.fromCharCode(...decimalCodeArray);
              }
              

              还有函数的用法

              import { ObjectId } from "mongodb";
              
              const myId = "user-0000001"; // must contains 12 character for "mongodb": 4.3.0
              const myObjectId = new ObjectId(myId); // create ObjectId from string
              
              console.log(myObjectId.toString()); // hex string >> 757365722d30303030303031
              console.log(myObjectId.toHexString()); // hex string >> 757365722d30303030303031
              
              const convertedFromToHexString = hexStringToCharString(
                myObjectId.toHexString(),
              );
              
              const convertedFromToString = hexStringToCharString(myObjectId.toString());
              
              console.log(`convertedFromToHexString:`, convertedFromToHexString);
              //convertedFromToHexString: user-0000001
              console.log(`convertedFromToString:`, convertedFromToString);
              //convertedFromToHexString: user-0000001
              

              还有 TypeScript 版本的 hexStringToCharString() 函数

              function hexStringToCharString(hexString: string): string {
                const hexCodeArray: string[] = [];
              
                for (let i = 0; i < hexString.length - 1; i += 2) {
                  hexCodeArray.push(hexString.slice(i, i + 2));
                }
              
                const decimalCodeArray: number[] = hexCodeArray.map((hex) =>
                  parseInt(hex, 16),
                );
              
                return String.fromCharCode(...decimalCodeArray);
              }
              

              【讨论】:

                【解决方案13】:

                只需使用这个:_id.$oid

                然后你得到 ObjectId 字符串。这是对象自带的。

                【讨论】:

                【解决方案14】:

                觉得这很有趣,但对我有用:

                    db.my_collection.find({}).forEach((elm)=>{
                
                    let value = new String(elm.USERid);//gets the string version of the ObjectId which in turn changes the datatype to a string.
                
                    let result = value.split("(")[1].split(")")[0].replace(/^"(.*)"$/, '$1');//this removes the objectid completely and the quote 
                    delete elm["USERid"]
                    elm.USERid = result
                    db.my_collection.save(elm)
                    })
                

                【讨论】:

                • 你好霍根杰瑞,欢迎来到 StackOverflow!请仅对代码部分使用代码格式,这样会更容易阅读:)祝您有美好的一天!
                • 谢谢...太激动了
                【解决方案15】:

                您可以使用字符串格式。

                const stringId = `${objectId}`;

                【讨论】:

                  【解决方案16】:

                  在聚合时使用 $addFields

                  $addFields: {
                        convertedZipCode: { $toString: "$zipcode" }
                     }
                  

                  【讨论】:

                    【解决方案17】:

                    v4 文档(现在是最新版本)MongoDB NodeJS Driver 说:ObjectId 的 toHexString() 方法将 ObjectId id 作为 24 个字符的十六进制字符串表示形式返回。

                    【讨论】:

                      【解决方案18】:

                      在 Mongoose 中,您可以使用 ObjectId 上的 toString() 方法来获取 24 个字符的十六进制字符串。

                      Mongoose documentation

                      【讨论】:

                        【解决方案19】:

                        使用这个简单的技巧,your-object.$id

                        我得到了一组 mongo Id,这就是我所做的。

                        jquery:

                        ...
                        success: function (res) {
                           console.log('without json res',res);
                            //without json res {"success":true,"message":" Record updated.","content":[{"$id":"58f47254b06b24004338ffba"},{"$id":"58f47254b06b24004338ffbb"}],"dbResponse":"ok"}
                        
                        var obj = $.parseJSON(res);
                        
                        if(obj.content !==null){
                            $.each(obj.content, function(i,v){
                                console.log('Id==>', v.$id);
                            });
                        }
                        
                        ...
                        

                        【讨论】:

                          【解决方案20】:

                          你可以使用String

                          String(a['_id'])
                          

                          【讨论】:

                            【解决方案21】:

                            如果您将Mongoose 与 MongoDB 一起使用,它具有用于获取 ObjectID 的字符串值的内置方法。我用它成功地做了一个if 语句,它使用=== 来比较字符串。

                            来自documentation

                            默认情况下,Mongoose 会为您的每个模式分配一个 id 虚拟 getter,它将文档的 _id 字段转换为字符串,或者在 ObjectIds 的情况下,返回其 hexString。如果您不希望将 id getter 添加到您的架构中,您可以通过在架构构建时传递此选项来禁用它。

                            【讨论】:

                              猜你喜欢
                              • 2011-12-11
                              • 2018-11-09
                              • 2017-03-11
                              • 2022-01-02
                              • 1970-01-01
                              • 2014-04-20
                              • 1970-01-01
                              • 1970-01-01
                              • 2018-05-11
                              相关资源
                              最近更新 更多