Вставка данных в MongoDB - без ошибок, без вставки

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

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

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

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

Я даже попытался определить индексы перед выполнением индексов. Я попытался вставить данные с использованием функций по умолчанию 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);
        }
    });
}

В обоих случаях - вставка новых данных и вставка дублированных данных, которые никак не изменяют базу данных - ERROR имеет значение null и SAVED - это всего лишь копия данных, которые должны быть вставлены. Есть ли способ проверить, была ли вставка сделана или нет, или мне нужно проверить, существуют ли данные в базе данных или нет вручную до/после создания вставки?

Ответы

Ответ 1

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

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

Ответ 2

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

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