Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 替换节点mongo native的ObjectID方法_Node.js_Mongodb_Node Mongodb Native - Fatal编程技术网

Node.js 替换节点mongo native的ObjectID方法

Node.js 替换节点mongo native的ObjectID方法,node.js,mongodb,node-mongodb-native,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

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

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

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

但我建议您重新考虑生成ID的算法,因为它不会生成保证唯一的ID。看起来您正在为一个已经解决的问题重新设计一个解决方案——在数据库驱动程序的ObjectID生成中解决了这个问题。当您在使用ObjectID作为ObjectID类型时遇到问题,并且希望使用字符串时,为什么不生成ObjectID并将其转换为字符串,然后再将其分配给文档的_id

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

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

> 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);
};

此函数允许以十六进制字符串或mongodb ObjectID的形式传递id。

为什么不使用Mongoose之类的工具来为您处理ObjectID/字符串转换?或者,只需将
\u id
属性设置为您的函数。你不必让司机来设定。仅供参考——您的函数将生成所写的副本<代码>对象IDs不应该。这是个好主意。有没有一种方法可以让驱动程序自动为包含十六进制字符串的插入创建新的对象ID?我宁愿在保存新对象时不必设置ID。@RobKohr也许你可以用一些
.prototype
技巧来做些什么。或者您可以创建一个自己的包装器函数,该函数设置
\u id
,然后调用
集合.insert