2

我正在开发一个带有 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 _id 必须是唯一的,并且可以是除数组之外的任何类型。我还查看了这个问题在 MongoDB 中创建自定义对象 ID,这是类似的,但它并没有解决我的问题。为什么我不能使用字符串作为自定义 _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": "..",
    "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": "..",
    "kerberos" : "..*",
    "mongodb": "2.0.49",
    "monk": "~1.0.1",
    "morgan": "~1.6.1",
    "node-gyp": "^3.1.0",
    "serve-favicon": "~2.3.0"
  }

4

2 回答 2

3

因此,您实际上并没有mongodb直接使用,而是通过monk(db.get('contactlist')放弃了...),并monk自动转换_idObjectId,这就是您收到该错误的原因。

看起来这种行为无法关闭,因此您可能必须将代码迁移到mongodb.

于 2015-12-03T20:34:00.827 回答
0

monk确实可以_id根据文档将 uuid 设置为您的选项。简单castIds地将选项对象中的设置为 false。

collection.insert(
    {_id: uuid, data: data},
    {castIds: false}
)
于 2019-02-08T15:45:03.990 回答