Вставка данных в MongoDB - без ошибок, без вставки - PullRequest
15 голосов
/ 27 февраля 2012

В настоящее время я пытаюсь создать форму регистрации, используя mongoDB и nodeJS - я создал новую базу данных и коллекцию - я хочу сохранить: имя пользователя, пароль, адрес электронной почты и insert_time в моей базе данных.

IЯ добавил уникальные индексы к имени пользователя / электронной почте и проверил, работает ли он - и я не могу добавить дублированную запись, используя консоль mongo или rockmongo (менеджер php mongodb) - так что все работает нормально.

Однако - когда кусоккода, который должен зарегистрировать новую учетную запись, выполняется и выполняет вставку с данными, которые уже находятся в базе данных - он возвращает объект, который содержит все данные, которые должны были быть добавлены с новым уникальным идентификатором.Суть в том, что он должен возвращать ошибку, которая говорит о том, что записи не могут быть продублированы и вставка не удалась - вместо этого он возвращает данные обратно и присваивает ему новый идентификатор.Данные, которые уже находятся в базе данных, остаются нетронутыми - даже идентификатор остается прежним - он не перезаписывается новым, возвращаемым вставкой скрипта.

Итак, вопрос в том ... что я делаю неправильно?Или, может быть, все в порядке, и вставка базы данных должна возвращать данные, даже если она не удалась? ...

Я даже пытался определить индексы перед выполнением индексов.Я попытался вставить данные, используя стандартные функции mongoDB и функции mongoJS - результат одинаков в обоих случаях.

Код, который я пытаюсь выполнить (для mongoJS ):

var dbconn = require("mongojs").connect('127.0.0.1:27017/db', ['users']);

var register = function(everyone, params, callback)
{
    // TODO: validation

    dbconn.users.ensureIndex({username:1},{unique:true});
    dbconn.users.ensureIndex({email:1},{unique:true});

    dbconn.users.save(
    {
        username: params.username,
        password: params.password,
        email: params.email,
        insert_time: Date.now()
    },
    function(error, saved)
    {
        if(error || !saved)
        {
            callback(false);
        }
        else
        {
            console.log(error);
            console.log(saved);
            callback(true);
        }
    });
}

В обоих случаях - вставка новых данных и вставка дублированных данных, которые никак не изменяют базу данных - ОШИБКА равна нулю, а SAVED - это просто копия данных, которая должна быть вставлена,Есть ли способ проверить, была ли выполнена вставка или нет - или мне нужно проверить, существуют ли данные в базе данных или нет вручную до / после выполнения вставки?

Ответы [ 2 ]

13 голосов
/ 27 февраля 2012

Монго работает именно так. Вы должны сообщить, что хотите вернуть ошибки, используя опцию safe при вводе команды save (по умолчанию используется метод «забей и забудь»).

https://docs.mongodb.com/manual/reference/command/getLastError/

1 голос
/ 27 февраля 2012

Это похоже на ту же проблему, что и Уникальный индекс MongoDB не работает - но с JavaScript API, а не с Java.То есть сохранение без указания «безопасного» флага или явной проверки последнего значения ошибки небезопасно - идентификатор генерируется на стороне клиента и отправляется команда, но она все равно может завершиться ошибкой (например, из-за нарушения уникального индекса).Вам необходимо явно получить последнее состояние ошибки.

http://www.mongodb.org/display/DOCS/dbshell+Reference#dbshellReference-ErrorChecking предлагает db.getLastError() с использованием командной оболочки, и я предполагаю, что API-интерфейс узла идентичен, когда они могут сделать это так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...