est-il un moyen pour générer automatiquement ObjectId quand une mangouste Modèle qui est nouveau, ed?
est-il un moyen de déclarer un schéma du Modèle de la mangouste, de sorte que, lorsque le modèle est nouveau ed le champ _id serait de générer 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 super!, je vais le faire
_id: {type:ObjectIdSchema, default: new ObjectId()}
mais bien sûr, cela ne fonctionne pas, car de nouveaux ObjectId() est appelée uniquement sur initialiser le schéma. afin d'appeler les nouveaux Persion() deux fois crée deux objets avec le même _id valeur.
donc, il y a un moyen de le faire, de sorte que chaque fois que je fais "new Personne()" qu'une nouvelle ObjectId() est généré?
la raison pour laquelle je suis en train de le faire c'est parce que j'ai besoin de connaître la valeur de la nouvelle personne _id valeur pour la poursuite du traitement.
j'ai aussi essayé:
var person = new Person({firstName: "Joe", lastName: "Baz"});
person.save(function(err, doc, num){
console.log(doc._id);
});
même alors, le doc ne contient pas de ObjectId. mais si je regarde dans la base de données, il ne contient pas.
p.s. je suis l'aide de la mangouste 2.7.1
p.p.s. je sais que je peux créer manuellement le champ 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 préfère ne pas avoir à importer ObjectId et ont à nouveau chaque fois que je veux à nouveau une Personne. suppose que je suis habitué à l'aide du pilote java pour mongodb, où je peux juste créer de la valeur pour le champ _id dans le Modèle de constructeur.
OriginalL'auteur Khon | 2012-07-22
Vous devez vous connecter pour publier un commentaire.
le moment où vous appelez var personne = new Personne();
personne._id devrait vous donner l'id (même si elle n'a pas encore été enregistrée). Juste de l'instanciation, il suffit de donner un id. Vous pouvez encore sauver la suite, et qui va stocker l'identifiant ainsi que le reste de la personne objet
_id
champ dans le schéma.vous et la Dernière Rose Studios sont corrects. c'est exactement comme vous l'avez dit. j'ai commenté la ligne "_id: ObjectIdSchema," et quand j'ai du nouveau ed Personne (), il avait l'id! mais quand je n'ai pas à la commenter, l'id n'a jamais été généré. merci les gars! très apprécié.
Pour les nouveaux téléspectateurs, a ce comportement a changé depuis? Aujourd'hui, j'ai été obligé de mentionner
default: new mongoose.Types.ObjectId()
sans laquelle il ne fonctionnait pas si j'ai ajouté_id
à l'intérieur du modèle de schéma!Je peux l'écho des commentaires ci-dessus, à l'aide d'un noeud version 4.8.1 , si _id est déclaré dans le Schéma , la _id ne sera pas généré automatiquement
OriginalL'auteur Last Rose Studios
Ajouter le
auto
drapeau:source
OriginalL'auteur yishaiz
Au lieu de:
Que vous devez faire:
[Erreur: document doit avoir un _id avant de l'enregistrer]
Cette réponse est toujours utile, car les sous-documents, par exemple, n'ont pas d'auto-généré _id
c'est toujours d'actualité, surtout à dockerized mongo image
OriginalL'auteur user3209935