2012-02-26 183 views
14

我目前正在尝试使用mongoDB和nodeJS做一个注册表单 - 我创建了新的数据库和集合 - 我想存储:用户名,密码,电子邮件和insert_time在我的数据库。插入数据到MongoDB - 没有错误,没有插入

我已经添加了唯一索引到用户名/电子邮件,并检查它是否工作 - 我不能使用mongo的控制台或rockmongo(php mongodb管理器)添加重复的条目 - 因此它工作正常。

但是 - 当应该注册新帐户的代码片段正在执行并且使用已经在数据库中的数据进行插入时,它会返回一个包含应该添加的所有数据的对象与一个新的,唯一的ID。重点是 - 它应该返回一个错误,表明条目不能被复制并且插入失败 - 而是返回数据并给它一个新的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); 
     } 
    }); 
} 

对于两种情况 - 插入新的数据并插入不以任何方式修改数据库的重复数据 - 错误为空并保存只是应该插入的数据的副本。有没有办法检查插入是否被做 - 或者我必须在插入之前/之后检查数据是否已经存在于数据库中或者没有手动检查?

回答

1

这看起来基本上与MongoDB unique index does not work相同 - 但使用JavaScript API而不是Java。也就是说,在没有指定“安全”标志或显式检查最后一个错误值是不安全的情况下保存---客户端生成的ID和分派的命令,但它可能仍然失败(例如,由于唯一索引违反)。您需要明确获取最后的错误状态。

http://www.mongodb.org/display/DOCS/dbshell+Reference#dbshellReference-ErrorChecking建议使用命令shell的db.getLastError(),我假设节点API是相同的,他们可以这样做。

+0

使用db.getLastError时,控制台不返回任何值() - 我猜蒙戈不保存任何错误 - 但正如我所说 - 它不会让我插入重复条目 - 我“可以”只使用nodeJS。 – biphobe 2012-02-26 22:05:33