为什么我不能在我的 NodeJS 应用程序中将字符串 uuid 用于自定义 MongoDB _id?
Why can't I use a string uuid for a custom MongoDB _id in my NodeJS app?
我正在开发一个带有 MongoDB 数据库的 NodeJS 应用程序(使用本机 MongoDB NodeJS 驱动程序)并且想使用一个字符串作为我的主键。
当 _id 是一个字符串时,这个插入对我来说失败了:
collection.insert({_id : "customId", name : "sampleName", email : "sampleEmail"}, {}, function(err, result) {
if (err) {
res.send({msg : err});
}
else {
res.send({msg : 'SUCCESS'});
}
});
此代码在我的 NodeJS 应用程序中。当我在我的数据库上通过 mongo shell 命令尝试相同的插入时,它工作正常。
我知道 MongoDB 主键的自定义 _id 字段必须保证是唯一的。我计划在我的代码中使用 uuid 字符串,但似乎没有字符串 _id 起作用。我在这里读到 https://docs.mongodb.org/manual/core/document/#field-names that _id must be unique and can be of any type except array. I have also reviewed this question Creating custom Object ID in MongoDB 是相似的,但它并没有解决我的问题。为什么我不能使用字符串作为自定义 _id 字段?
编辑:错误消息显示“[错误:传入的参数必须是 12 个字节的单个字符串或 24 个十六进制字符的字符串]”
编辑 2:
这是我的完整代码:
router.post('/addcontact', function(req, res) {
var db = req.db;
var newContact = req.body;
var newContactId = uuid.v4();
var newContactId = String(newContactId);
//newContact['_id'] = newContactId;
var collection = db.get('contactlist');
console.log("about to do insert");
try {
collection.insert({_id : '4BF6EFC6-1682-4A40-A0DE-8CD104AC92D3', name : "testName", email : "testEmail", phone : "testPhone"}, {}, function(err, result){
if (err) {
res.send({msg : err});
}
else {
res.send({msg : 'SUCCESS'});
// log operation in log file with Kafka
var producer = req.kafkaProducer;
var payload = {topic : 'logging', messages: 'POST /addcontact id:' + newContactId + ' ' + newContact["name"]};
producer.send([payload], function (err, data) {
// console.log(data);
});
}
});
}
catch (err) {
console.log(err);
} });
请注意,我实际上并没有使用来自 http POST 的 newContact 信息,而只是试图让示例插入工作。
这是控制台打印出的错误:
about to do insert
[Error: Argument passed in must be a single String of 12 bytes or a string of 24 hex characters]
POST /contacts/addcontact - - ms - -
这是我的 package.json 依赖项:
{
"name": "NodeApp2",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node ./bin/www"
},
"dependencies": {
"async": "<em>.</em>.<em>",
"body-parser": "~1.13.2",
"cookie-parser": "~1.3.5",
"couchbase": "^2.1.2",
"debug": "~2.2.0",
"express": "~4.13.1",
"jade": "~1.11.0",
"kafka-node": "</em>.<em>.</em>",
"kerberos" : "<em>.</em>.*",
"mongodb": "2.0.49",
"monk": "~1.0.1",
"morgan": "~1.6.1",
"node-gyp": "^3.1.0",
"serve-favicon": "~2.3.0"
}</pre>
所以你实际上并没有使用 mongodb
directly, but through monk
(db.get('contactlist')
放弃了...),并且 monk
自动将 _id
转换为 ObjectId
,这就是您收到该错误的原因。
看起来像这种行为 can't be turned off,因此您可能必须将代码迁移到 mongodb
。
monk
确实可以根据 docs 将 uuid 设置为您的 _id
。只需在选项对象中将 castIds
设置为 false。
collection.insert(
{_id: uuid, data: data},
{castIds: false}
)
我正在开发一个带有 MongoDB 数据库的 NodeJS 应用程序(使用本机 MongoDB NodeJS 驱动程序)并且想使用一个字符串作为我的主键。
当 _id 是一个字符串时,这个插入对我来说失败了:
collection.insert({_id : "customId", name : "sampleName", email : "sampleEmail"}, {}, function(err, result) {
if (err) {
res.send({msg : err});
}
else {
res.send({msg : 'SUCCESS'});
}
});
此代码在我的 NodeJS 应用程序中。当我在我的数据库上通过 mongo shell 命令尝试相同的插入时,它工作正常。
我知道 MongoDB 主键的自定义 _id 字段必须保证是唯一的。我计划在我的代码中使用 uuid 字符串,但似乎没有字符串 _id 起作用。我在这里读到 https://docs.mongodb.org/manual/core/document/#field-names that _id must be unique and can be of any type except array. I have also reviewed this question Creating custom Object ID in MongoDB 是相似的,但它并没有解决我的问题。为什么我不能使用字符串作为自定义 _id 字段?
编辑:错误消息显示“[错误:传入的参数必须是 12 个字节的单个字符串或 24 个十六进制字符的字符串]”
编辑 2:
这是我的完整代码:
router.post('/addcontact', function(req, res) {
var db = req.db;
var newContact = req.body;
var newContactId = uuid.v4();
var newContactId = String(newContactId);
//newContact['_id'] = newContactId;
var collection = db.get('contactlist');
console.log("about to do insert");
try {
collection.insert({_id : '4BF6EFC6-1682-4A40-A0DE-8CD104AC92D3', name : "testName", email : "testEmail", phone : "testPhone"}, {}, function(err, result){
if (err) {
res.send({msg : err});
}
else {
res.send({msg : 'SUCCESS'});
// log operation in log file with Kafka
var producer = req.kafkaProducer;
var payload = {topic : 'logging', messages: 'POST /addcontact id:' + newContactId + ' ' + newContact["name"]};
producer.send([payload], function (err, data) {
// console.log(data);
});
}
});
}
catch (err) {
console.log(err);
} });
请注意,我实际上并没有使用来自 http POST 的 newContact 信息,而只是试图让示例插入工作。
这是控制台打印出的错误:
about to do insert
[Error: Argument passed in must be a single String of 12 bytes or a string of 24 hex characters]
POST /contacts/addcontact - - ms - -
这是我的 package.json 依赖项:
{
"name": "NodeApp2",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node ./bin/www"
},
"dependencies": {
"async": "<em>.</em>.<em>",
"body-parser": "~1.13.2",
"cookie-parser": "~1.3.5",
"couchbase": "^2.1.2",
"debug": "~2.2.0",
"express": "~4.13.1",
"jade": "~1.11.0",
"kafka-node": "</em>.<em>.</em>",
"kerberos" : "<em>.</em>.*",
"mongodb": "2.0.49",
"monk": "~1.0.1",
"morgan": "~1.6.1",
"node-gyp": "^3.1.0",
"serve-favicon": "~2.3.0"
}</pre>
所以你实际上并没有使用 mongodb
directly, but through monk
(db.get('contactlist')
放弃了...),并且 monk
自动将 _id
转换为 ObjectId
,这就是您收到该错误的原因。
看起来像这种行为 can't be turned off,因此您可能必须将代码迁移到 mongodb
。
monk
确实可以根据 docs 将 uuid 设置为您的 _id
。只需在选项对象中将 castIds
设置为 false。
collection.insert(
{_id: uuid, data: data},
{castIds: false}
)