Почему я не могу использовать строковый uuid для пользовательского MongoDB _id в моем приложении NodeJS?

Я занимаюсь разработкой приложения NodeJS с базой данных MongoDB (используя собственный драйвер 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 в моей базе данных, она работает нормально.

Я знаю, что настраиваемые поля _id для первичных ключей MongoDB должны быть гарантированно уникальными. Я планирую использовать строку uuid в своем коде, но ни одна строка _id не работает. Я прочитал здесь https://docs.mongodb.org/manual/core/document/, что _id должен быть уникальным и может иметь любой тип, кроме массива. Я также рассмотрел этот вопрос Создание пользовательского идентификатора объекта в 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);
} });

Обратите внимание, что я на самом деле не использую информацию newContact из http POST, а просто пытаюсь заставить образец вставки работать.

Вот распечатка консоли с ошибкой:

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"
  }

1 ответ

Решение

Таким образом, вы на самом деле не используете mongodb напрямую, но через monk (db.get('contactlist') отдал его...) и monk автоматически бросает _id в ObjectId Вот почему вы получаете эту ошибку.

Похоже, что это поведение нельзя отключить, поэтому вам, вероятно, придется перенести код в mongodb,

monk действительно есть возможность установить uuid в качестве вашего _id согласно документам. Просто установите castIds false в объекте параметров.

collection.insert(
    {_id: uuid, data: data},
    {castIds: false}
)
Другие вопросы по тегам