替换node-mongo-native的ObjectID方法

时间:2013-09-29 15:25:35

标签: node.js mongodb node-mongodb-native

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而不是默认值?

2 个答案:

答案 0 :(得分:2)

我从来没有遇到过你需要转换ObjectID的问题,但我可能使用的技术堆栈与你不同。

当您保存到数据库的对象尚未包含名为_id的字段时,MongoDB文档的_id字段仅作为ObjectId自动生成。如果此字段已存在于已保存的文档中,则其值将用作_id。因此,当您想手动生成和分配ID时,您可以这样做。

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

 yourDocument._id = new ObjectID().toHexString();

答案 1 :(得分: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传递。