我目前正在尝试使用mongoDB和nodeJS创建一个注册表单 - 我创建了新的数据库和集合 - 我想在我的数据库中存储:用户名,密码,电子邮件和insert_time。
我已经为用户名/电子邮件添加了唯一索引并检查它是否有效 - 我无法使用mongo的控制台或rockmongo(php mongodb manager)添加重复的条目 - 所以它可以正常工作。
然而 - 当正在执行注册新帐户的代码片段并使用已存在于数据库中的数据进行插入时 - 它返回一个对象,该对象包含应该添加的所有数据一个新的,独特的身份。关键是 - 它应该返回一个错误,表示条目不能重复并且插入失败 - 而是返回数据并给它一个新的id。已经驻留在数据库中的数据保持不变 - 即使ID保持不变 - 也不会用脚本插入返回的新数据重写。
所以,问题是......我做错了什么?或者也许一切都很好,数据库的插入应该返回数据,即使它失败了吗?...
我甚至尝试在执行索引之前定义索引。 我尝试使用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只是应该插入的数据的副本。有没有办法检查是否插入 - 或者我是否必须在插入之前/之后检查数据是否已经存在于数据库中?
答案 0 :(得分:13)
Mongo以这种方式工作。您应该在发出save命令时使用safe选项告诉您想要返回错误(默认情况下,它使用“fire and forget”方法)。
https://docs.mongodb.com/manual/reference/command/getLastError/
答案 1 :(得分:1)
这看起来与MongoDB unique index does not work基本相同 - 但是使用JavaScript API而不是Java。也就是说,保存而不指定“安全”标志或显式检查最后一个错误值是不安全的 - 在客户端生成ID并调度命令,但它可能仍然失败(例如由于唯一索引违规)。您需要明确获取上次错误状态。
http://www.mongodb.org/display/DOCS/dbshell+Reference#dbshellReference-ErrorChecking建议db.getLastError()
使用命令shell,我假设节点API是相同的,他们可能会这样做。
答案 2 :(得分:0)
同样的问题解决了,只是忘了它的异步插入和任何节点process.exit停止添加数据
var lineReader = require('readline').createInterface({
input: require('fs').createReadStream('parse.txt')
});
lineReader.on('line', function (line) {
console.log(line)
db.insert(line,{w:1},function(e,d){ if (e) throw e })
});
// f this s, data are still adding when do close KUR WA MAC 2 days of my f life wasted
lineReader.on('close', function() {
// ----->>>>>> process.exit(); <<<<<----------
});