将数据插入 MongoDB - 没有错误,没有插入

Posted

技术标签:

【中文标题】将数据插入 MongoDB - 没有错误,没有插入【英文标题】:Inserting data to MongoDB - no error, no insert 【发布时间】:2012-02-26 21:33:12 【问题描述】:

我目前正在尝试使用 mongoDB 和 nodeJS 创建一个注册表单 - 我已经创建了新的数据库和集合 - 我想在我的数据库中存储:用户名、密码、电子邮件和 insert_time。

我已经为用户名/电子邮件添加了唯一索引并检查了它是否有效 - 我无法使用 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);
        
    );

对于这两种情况 - 插入新数据和插入不会以任何方式修改数据库的重复数据 - ERROR 为空,而 SAVED 只是应该插入的数据的副本。有什么方法可以检查是否进行了插入 - 或者我是否必须在插入之前/之后手动检查数据是否已经存在于数据库中?

【问题讨论】:

在结束解析文件执行“进程退出”时遇到类似问题,但即使控制台日志显示处理文件已完成,数据仍在添加,即使在后台。我的坏插入是异步的 dammmmmm 只是不要退出太快 【参考方案1】:

Mongo 就是这样工作的。您应该在发出 save 命令时使用安全选项告诉您想要恢复错误(默认情况下,它使用“触发并忘记”方法)。

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

【讨论】:

在“保存”功能中添加“安全:真”解决了我的问题。谢谢。【参考方案2】:

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

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

【讨论】:

控制台在使用 db.getLastError() 时不返回任何值 - 我猜 mongo 不会保存任何错误 - 但正如我所说 - 它不允许我插入重复的条目 -我“可以”只使用 nodeJS 来做到这一点。【参考方案3】:

同样的问题解决了,只是忘记了它的异步插入和任何节点 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(); <<<<<----------   
    );

【讨论】:

以上是关于将数据插入 MongoDB - 没有错误,没有插入的主要内容,如果未能解决你的问题,请参考以下文章

mongoDB 插入数据

在 Spring Boot 应用程序初始化时将数据插入 MongoDB 容器

在使用 node.js 完成所有承诺后,我想在 mongodb 中插入数据

MongoDB 错误:通过 JSON 文件以 ISO 格式将日期插入 MongoDB

为啥这段代码没有将数据插入数据库?

我在 PHP 中插入带有地理空间数据的 Mongodb 记录时遇到问题