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,
}
¿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étodoObjectId.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.