parse nodejs node node.js mongodb mongoose

node.js - nodejs - parse node js



¿hay una manera de generar automáticamente ObjectId cuando un modelo de mangosta es nuevo? (4)

Añadir el indicador auto :

_id: { type: mongoose.Schema.Types.ObjectId, index: true, required: true, auto: true, }

source

¿hay una manera de declarar un esquema de modelo en mangosta para que cuando el modelo sea nuevo el campo _id se genere automáticamente?

por ejemplo:

var mongoose = require(''mongoose''); var Schema = mongoose.Schema; var ObjectIdSchema = Schema.ObjectId; var ObjectId = mongoose.Types.ObjectId; var PersonSchema = new Schema({ _id: ObjectIdSchema, firstName: {type: String, default: ''N/A''}, lastName: {type: String, default: ''N/A''}, age: {type: Number, min: 1} }); var Person = mongoose.model(''Person'', PersonSchema);

Al principio, me pareció genial !, lo haré

_id: {type:ObjectIdSchema, default: new ObjectId()}

pero, por supuesto, eso no funciona, porque al nuevo ObjectId () solo se llama al inicializar el esquema. de modo que llamar a Persion () dos veces crea dos objetos con el mismo valor _id.

Entonces, ¿hay una manera de hacerlo para que cada vez que haga "nueva Persona ()" se genere un nuevo ObjectId ()?

La razón por la que estoy tratando de hacer esto es porque necesito saber el valor del valor _id de la nueva persona para su posterior procesamiento.

También intenté:

var person = new Person({firstName: "Joe", lastName: "Baz"}); person.save(function(err, doc, num){ console.log(doc._id); });

incluso entonces, doc no contiene el ObjectId. pero si miro en la base de datos, lo contiene.

ps estoy usando mangosta 2.7.1

pps Sé que puedo crear manualmente el ObjectId al crear la persona como tal:

var person = new Person({_id: new ObjectId(), firstName: "Joe", lastName: "Baz"});

pero prefiero no tener que importar ObjectId y tengo que renovarlo cada vez que quiero crear una persona. Supongo que estoy acostumbrado a usar el controlador java para mongodb, donde puedo crear el valor para el campo _id en el constructor de modelos.


En lugar de:

_id: {type:ObjectIdSchema, default: new ObjectId()}

Deberías hacer:

_id: {type:ObjectIdSchema, default: function () { return new ObjectId()} }


Tomado del manual oficial de MongoDB y documentos:

_carné de identidad

Un campo requerido en cada documento de MongoDB. El campo _id debe tener un valor único. Puede pensar en el campo _id como la clave principal del documento. Si crea un documento nuevo sin un campo _id , MongoDB crea automáticamente el campo y asigna un ObjectId BSON único.
Source

ObjectID

Los ObjectIds son pequeños, probablemente únicos, rápidos de generar y ordenados. Los valores de ObjectId constan de 12 bytes, donde los primeros cuatro bytes son una marca de tiempo que refleja la creación del ObjectId. Específicamente:

un valor de 4 bytes que representa los segundos desde la época de Unix, un valor aleatorio de 5 bytes y un contador de 3 bytes, que comienza con un valor aleatorio. En MongoDB, cada documento almacenado en una colección requiere un campo _id único que actúa como clave principal. Si un documento insertado omite el campo _id , el controlador MongoDB genera automáticamente un ObjectId para el campo _id .

Esto también se aplica a los documentos insertados a través de operaciones de actualización con upsert: true.

Los clientes de MongoDB deben agregar un campo _id con un ObjectId único. El uso de ObjectIds para el campo _id proporciona los siguientes beneficios adicionales: en el shell mongo, puede acceder a la hora de creación del ObjectId , utilizando el método ObjectId.getTimestamp() . ordenar en un campo _id que almacena los valores de ObjectId es aproximadamente equivalente a ordenar por tiempo de creación.

IMPORTANTE
Si bien los valores de ObjectId deberían aumentar con el tiempo, no son necesariamente monotónicos. Esto es porque ellos:

Solo contienen un segundo de resolución temporal, por lo que los valores de ObjectId creados dentro del mismo segundo no tienen un orden garantizado, y son generados por los clientes, que pueden tener diferentes relojes del sistema.
Fuente

Declarando explícitamente _id :

Al declarar explícitamente el campo _id , especifique la opción auto :

new Schema({ _id: { type: Schema.ObjectId, auto: true }})

Solo ObjectId: agrega un valor predeterminado de ObjectId generado automáticamente si turnOn es verdadero.
Source

TL; DR

Si crea un documento nuevo sin un campo _id, MongoDB crea automáticamente el campo y asigna un ObjectId BSON único.


en el momento en que llamas var person = new Person (); person._id debería darte el ID (incluso si aún no se ha guardado). Solo instanciarlo es suficiente para darle una identificación. Aún puede guardarlo después, y eso almacenará el ID, así como el resto del objeto de persona.