2011-05-20 41 views
15

Quiero recuperar el último insertado _id, usando mangosta como envoltorio MongoDB para node.js. He encontrado el siguiente tutorial, pero no puedo cambiar cualquiera de los módulos de nodos debido a que la aplicación se ejecuta en un servidor público:Node + Mongoose: ¿Obtener la última identificación insertada?

Getting "Last Inserted ID" (hint - you have to hack Mongoose)

¿Alguna otra idea? Esto lo que quiere hacer:

  • Insertar nuevo usuario
  • obtener el valor del usuario _id
  • Establecer una nueva sesión basado en ID de usuario
  • redirección a/

Gracias!

Respuesta

33

estoy usando la versión 1.2.0 mangosta y tan pronto como he creado una nueva instancia de un modelo de mangosta, el _id ya está establecido.

coffee> u = new User() 
[object Object] 
coffee> u._id 
4dd68fc449aaedd177000001 

También comprobó que después de que yo llamo el u.save()_id sigue siendo el mismo. Comprobé a través de MongoHub que esta es realmente la identificación real guardada en MongoDB.

+0

agradable de escuchar!gracias por probar! – Tronic

0

Con MongoDB, si no establece explícitamente el valor _id de un documento, el controlador del cliente lo configurará automáticamente en un valor ObjectId. Esto es diferente de las bases de datos que pueden generar ID en el servidor y necesitan otra consulta para recuperarlo, como con scope_identity() de SQL Server o last_insert_id() de MySQL.

Esto le permite insertar los datos de forma asíncrona, ya no tienen que esperar a que el servidor devuelva un valor _id antes de continuar.

Por lo tanto, como se muestra en la respuesta de Peter, el _id está disponible antes de guardar el documento en la base de datos.

3

Si está buscando obtener la última _id insertada de un subobjeto, cree el objeto y agréguelo al elemento. He aquí un ejemplo en NowJS utilizando MongoDB y Mangosta (añadir un poco de azúcar esquema) que luego se convierte el resultado a JSON para enviar de vuelta al cliente:

   var nowRoomID = this.now.room; 
       var Conversation = mongoose.model('Conversation'); 
       Conversation.findById(convID, function(error, conversation) { 
        var Blip = mongoose.model('Blip'); 
        var createdBlip = new Blip(); 
        createdBlip.author= nowUserName; 
        createdBlip.authorid = parsed.authorid; 
        createdBlip.body = revisedText; 
        createdBlip.created_at = new Date(); 
        createdBlip.modified_at = new Date(); 

        conversation.blips.push(createdBlip); 
        parsed._id = createdBlip._id; //NOTE: ID ACCESSED HERE 
        message = JSON.stringify(parsed); 

        conversation.save(function (err) { 
         if (!err) { 
          console.log('Success - saved a blip onto a conversation!'); 
          nowjs.getGroup(nowRoomID).now.receiveMessage(nowUserName, message); 
         } 

        }); 
0

acabo de obtener el ID del documento pasó a la devolución de llamada, desde guardar devuelve el documento guardado.

5

Si se declara explícitamente

_id: Schema.ObjectId 

para su modelo, entonces el OBJECTID no estará disponible después de nuevo o guardar. Esto es probablemente un error.

+1

Confirmo este error. – Olivier

Cuestiones relacionadas