0

mongo中使用的objectID对象在与json来回传递和与其他应用程序通信时似乎有点难以处理。看来要使用它,我必须在用于查询的对象和用于 json 消息传递的字符串之间来回转换。

我认为 node-mongo-native 默认将我的 _id 创建为字符串会很好。像这样的东西会成为一个很好的独特的 id 生成系统,它也可以兼作时间戳:

function createID(){
   return (Date.now() + ((Math.round(Math.random()*1000000))/1000000) ).toString();
}

有没有办法让 node-mongo-native 使用这个函数来生成 id 而不是默认值?

4

2 回答 2

2

我从来没有遇到过您描述的必须转换 ObjectID 的问题,但我可能使用了与您不同的技术堆栈。

_id只有当您保存到数据库的对象尚未包含名为的字段时,MongoDB 文档的字段才会自动生成为 ObjectId _id。当保存的文档中已经存在该字段时,其值将用作_id. 因此,当您想手动生成和分配 id 时,您可以这样做。

但我建议您重新考虑生成 ID 的算法,因为它不会生成有保证的唯一 ID。似乎您正在为已经解决的问题重新发明一个解决方案 - 在您的数据库驱动程序的 ObjectID 生成中解决。当您在使用 ObjectID 作为 ObjectID 类型时遇到问题并且宁愿使用字符串,那么为什么不生成一个 ObjectID 并将其转换为字符串,然后再将其分配给文档的 _id 呢?

 yourDocument._id = new ObjectID().toHexString();
于 2013-09-30T08:47:49.303 回答
0

我从来没有遇到过来回传递的问题,因为它会自动转换为字符串,如以下示例所示:

> var ObjectID = require('mongodb').ObjectID
undefined

> ObjectID.createPk()
52fcb07f46d17400006f44ac

> typeof ObjectID.createPk()
'object'

> JSON.stringify({_id: ObjectID.createPk()})
'{"_id":"52fcb09346d17400006f44ae"}'

> ObjectID.createPk().toString()
'52fcb09d46d17400006f44af'

唯一需要注意的是在使用 _id 编写查询(无论是获取记录还是更新内容)时,我通常会这样做:

exports.getCustomerByID = function (id, callback) {
  db.collection('customers').findOne({
    _id: new ObjectID(id.toString())
  }, callback);
};

此函数允许将 id 作为十六进制字符串或 mongodb ObjectID 传递。

于 2014-02-13T11:55:27.070 回答