我目前正在try 使用mongoDB和nodeJS制作一个注册表单——我已经创建了新的数据库和集合——我想在我的数据库中存储:用户名、密码、邮箱和插入时间.

我已经为用户名/邮箱添加了唯一的索引,并判断了它是否有效——我不能使用mongo的控制台或rockmongo(php mongodb管理器)添加重复的条目——所以它可以正常工作.

然而,当本应注册一个新帐户的代码段被执行并插入数据库中已有的数据时,它返回一个对象,该对象包含本应使用新帐户添加的所有数据,唯一id.关键是——它应该返回一个错误,表明条目不能复制,插入失败——相反,它返回数据并给它一个新id.数据库中已经存在的数据保持不变——即使id保持不变——它不会用脚本插入返回的新id重写.

所以,问题是...我做错了什么?或者可能一切正常,即使数据库插入失败,也应该返回数据?...

我甚至try 在执行索引之前定义索引.

我试图执行的代码(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);
        }
    });
}

对于这两种情况——插入新数据和插入不以任何方式修改数据库的重复数据——错误为空,保存的只是应该插入的数据的副本.有没有办法判断是否进行了插入?或者在插入之前/之后,我是否必须手动判断数据库中是否已经存在数据?

推荐答案

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

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

Mongodb相关问答推荐

使用单个/多个值查询任何/特定,而不使用if块

geoLocation或geoNear为坐标和半径使用let变量

MongoDB.ArrayFilters出错:在路径中找不到标识符';elem';的数组筛选器

如何使用聚合管道查找未销售但存在于产品详细信息集合中的产品的ID

MongoDB 聚合 groupBy 日期并计算子文档

MongoDB shell:如何删除列表以外的所有集合

使用golang中的过滤器从mongodb复合集合中获取所有数据

MongoDB:嵌套数组计数+原始文档

$lookup 的参数必须是字符串

Meteor 和 Fibers/bindEnvironment() 是怎么回事?

mongoose中的 required是什么意思?

在 Mongoose 中清理用户输入

如何在 MongoDb 中使用杰克逊将日期字段存储为 ISODate()

不能在模块外使用 import 语句

MongoDB - 投影一个并不总是存在的字段

MongoDB聚合将字符串数组连接到单个字符串

Mongoose:查询starts with

在 MongoDB 中快速搜索数十亿个小文档的策略

Mongodb 按字段名称查找任何值

如何在mongoose的嵌套填充中 Select 特定字段