Вставка данных в 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 идентичен, где они могут сделать это так.