web-dev-qa-db-fra.com

existe-t-il un moyen de générer automatiquement ObjectId lorsqu'un modèle mangouste est nouveau?

existe-t-il un moyen de déclarer un schéma de modèle en mangouste afin que lorsque le modèle est nouveau, le champ _id se génère automatiquement?

par exemple:

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);

au début, je pensais bien !, je vais juste faire

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

mais bien sûr cela ne fonctionne pas, car le nouvel ObjectId () n'est appelé qu'à l'initialisation du schéma. donc appeler deux fois Persion () crée deux objets avec la même valeur _id.

alors y a-t-il un moyen de le faire pour que chaque fois que je fais "new Person ()" qu'un nouvel ObjectId () soit généré?

la raison pour laquelle j'essaie de le faire est parce que j'ai besoin de connaître la valeur de la valeur _id de la nouvelle personne pour un traitement ultérieur.

j'ai aussi essayé:

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

même dans ce cas, doc ne contient pas l'ObjectId. mais si je regarde dans la base de données, elle la contient.

p.s. j'utilise mangouste 2.7.1

p.p.s. Je sais que je peux créer manuellement l'ObjectId lors de la création de la personne en tant que telle:

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

mais je n'ai pas besoin d'importer ObjectId et de le renouveler chaque fois que je veux créer une nouvelle personne. suppose que je suis habitué à utiliser le pilote Java pour mongodb, où je peux simplement créer la valeur du champ _id dans le constructeur du modèle.

24
Khon

au moment où vous appelez var person = new Person (); person._id devrait vous donner l'identifiant (même s'il n'a pas encore été enregistré). Il suffit de l'instancier pour lui donner un identifiant. Vous pouvez toujours l'enregistrer après, et cela stockera l'identifiant ainsi que le reste de l'objet personne

26
Last Rose Studios

Ajoutez l'indicateur auto:

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

source

21
yishaiz

Au lieu de:

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

Tu devrais faire:

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

Tiré du manuel et des documents officiels de MongoDB:

_id

Un champ obligatoire dans chaque document MongoDB. Le champ _id Doit avoir une valeur unique. Vous pouvez considérer le champ _id Comme la clé primaire du document. Si vous créez un nouveau document sans champ _id, MongoDB crée automatiquement le champ et attribue un BSON ObjectId unique.
Source


ObjectID

Les ObjectIds sont petits, probablement uniques, rapides à générer et ordonnés. ObjectId les valeurs se composent de 12 octets, où les quatre premiers octets sont un horodatage qui reflète la création de l'ObjectId. Plus précisément:

une valeur de 4 octets représentant les secondes depuis l'époque Unix, une valeur aléatoire de 5 octets et un compteur de 3 octets, en commençant par une valeur aléatoire. Dans MongoDB, chaque document stocké dans une collection nécessite un champ _id Unique qui agit comme une clé primaire. Si un document inséré omet le champ _id, Le pilote MongoDB génère automatiquement un ObjectId pour le champ _id.

Cela s'applique également aux documents insérés lors des opérations de mise à jour avec upsert: true.

Les clients MongoDB doivent ajouter un champ _id Avec un unique ObjectId. L'utilisation d'ObjectIds pour le champ _id Offre les avantages supplémentaires suivants: dans le shell Mongo, vous pouvez accéder à l'heure de création de ObjectId, à l'aide de la fonction ObjectId.getTimestamp() méthode. le tri sur un champ _id qui stocke les valeurs ObjectId équivaut à peu près au tri par heure de création.

[~ # ~] important [~ # ~]
Alors que les valeurs ObjectId devraient augmenter avec le temps, elles ne sont pas nécessairement monotones. En effet, ils:

Ne contiennent qu'une seconde de résolution temporelle, donc ObjectId les valeurs créées dans la même seconde n'ont pas de classement garanti et sont générées par les clients, qui peuvent avoir des horloges système différentes.
Source

Déclarant explicitement _id:

Lorsque vous déclarez explicitement le champ _id, Spécifiez l'option auto:

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

ObjectId uniquement - Ajoute un ObjectId généré automatiquement par défaut si turnOn est vrai.
Source


TL; DR

Si vous créez un nouveau document sans champ _id, MongoDB crée automatiquement le champ et attribue un BSON ObjectId unique.

4
user0800