-->

Inserting data to MongoDB - no error, no insert

2020-08-09 09:22发布

问题:

I'm currently trying to make a register form using mongoDB and nodeJS - I've created new database and collection - I want to store: username, password, email and insert_time in my database.

I've added unique indexes to username/email and checked if it works - and I can not add a duplicated entry using mongo's console or rockmongo (php mongodb manager) - so it works fine.

However - when the piece of code that is supposed to register a new account is being executed and makes an insert with the data that is already in database - it returns an object that contains all the data that was supposed to be added with a new, unique id. The point is - it should return an error that would say that entries can not be duplicated and insert failed - instead it returns the data back and gives it a new id. Data that already resides in database remains untouched - even the ID stays the same - it's not rewritten with the new one returned by script's insert.

So, the question is... what am I doing wrong? Or maybe everything is fine and database's insert should return data even if it's failed?...

I even tried defining indexes before executing indexes. I tried inserting the data using mongoDB's default functions and mongoJS functions - the result is the same in both cases.

The code I'm trying to execute (for 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);
        }
    });
}

For both cases - inserting new data and inserting duplicated data that doesn't modify database in any way - ERROR is null and SAVED is just a copy of data that is supposed to be inserted. Is there any way to check if insert was made or not - or do I have to check whether the data already exists in database or not manually before/after making an insert?

回答1:

Mongo works that way. You should tell you want to get errors back, using the safe option when you issue the save command (as per default it uses the "fire and forget" method).

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



回答2:

This looks to be basically the same problem as MongoDB unique index does not work -- but with the JavaScript API rather than Java. That is, saving without either specifying the "safe" flag or explicitly checking the last error value is unsafe--- the ID is generated client side and the command dispatched, but it might still fail (e.g. due to a unique index violation). You need to explicitly get the last error status.

http://www.mongodb.org/display/DOCS/dbshell+Reference#dbshellReference-ErrorChecking suggests db.getLastError() using the command shell, and I assume the node API is identical where they can possibly make it so.