Insertando datos en MongoDB – sin error, sin inserción

Actualmente estoy tratando de hacer un formulario de registro utilizando mongoDB y nodeJS. He creado una nueva base de datos y una colección. Quiero almacenar: nombre de usuario, contraseña, correo electrónico e insert_time en mi base de datos.

He agregado índices únicos al nombre de usuario / correo electrónico y he comprobado si funciona, y no puedo agregar una entrada duplicada usando la consola de mongo o rockmongo (administrador de php mongodb), así que funciona bien.

Sin embargo, cuando el fragmento de código que se supone que registra una nueva cuenta se está ejecutando y realiza una inserción con los datos que ya están en la base de datos, devuelve un objeto que contiene todos los datos que se suponía que se agregarían con una nueva, Identificación única. El punto es: debería devolver un error que diría que las entradas no se pueden duplicar y la inserción ha fallado; en cambio, devuelve los datos y le da una nueva identificación. Los datos que ya residen en la base de datos permanecen intactos, incluso el ID permanece igual, no se reescriben con el nuevo que se devuelve con el inserto del script.

Entonces, la pregunta es … ¿qué estoy haciendo mal? ¿O tal vez todo está bien y la inserción de la base de datos debería devolver datos incluso si falla? …

Incluso intenté definir índices antes de ejecutar índices. Intenté insertar los datos utilizando las funciones predeterminadas de mongoDB y las funciones de mongoJS ; el resultado es el mismo en ambos casos.

El código que estoy tratando de ejecutar (para 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); } }); } 

En ambos casos, insertando nuevos datos e insertando datos duplicados que no modifican la base de datos de ninguna manera, ERROR es nulo y GUARDADO es solo una copia de los datos que se supone que se insertarán. ¿Hay alguna forma de verificar si la inserción se realizó o no, o tengo que verificar si los datos ya existen en la base de datos o no manualmente antes / después de hacer una inserción?

Mongo funciona de esa manera. Debería decir que desea volver a obtener los errores, utilizando la opción segura cuando emita el comando de guardar (de manera predeterminada, utiliza el método “encender y olvidar”).

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

Este parece ser básicamente el mismo problema que el índice único MongoDB no funciona , pero con la API de JavaScript en lugar de Java. Es decir, guardar sin especificar el indicador “seguro” o verificar explícitamente el último valor de error es inseguro: la ID se genera en el lado del cliente y se envía el comando, pero aún puede fallar (por ejemplo, debido a una violación de índice única). Necesita obtener explícitamente el último estado de error.

http://www.mongodb.org/display/DOCS/dbshell+Reference#dbshellReference-ErrorChecking sugiere db.getLastError() usando el shell de comandos, y asumo que la API del nodo es idéntica donde posiblemente puedan hacerlo.