Comment définir ObjectId comme type de données dans mongoose

En utilisant node.js, mongodb sur mongoHQ et mongoose. Je mets un schéma pour les catégories. Je voudrais utiliser le document ObjectId comme categoryId.

var mongoose = require('mongoose');

var Schema = mongoose.Schema,
    ObjectId = Schema.ObjectId;
var Schema_Category = new Schema({
    categoryId  : ObjectId,
    title       : String,
    sortIndex   : String
});

Je lance alors

var Category = mongoose.model('Schema_Category');
var category = new Category();
category.title = "Bicycles";
category.sortIndex = "3";

category.save(function(err) {
  if (err) { throw err; }
  console.log('saved');
  mongoose.disconnect();     
});

Notez que je ne fournis pas de valeur pour categoryId. J'ai supposé que mongoose utilisera le schéma pour le générer mais que le document a l'habituel " _id "et non"categoryId". Ce que je fais mal?

48
demandé sur idophir 2011-11-13 17:26:01

4 réponses

Contrairement aux RBDMs traditionnels, mongoDB ne vous permet pas de définir un champ aléatoire comme clé primaire, le champ _id doit exister pour tous les documents standard.

Pour cette raison, il n'est pas logique de créer un champ UUID séparé.

Dans mongoose, le type ObjectId n'est pas utilisé pour créer un nouvel uuid, mais plutôt pour référencer d'autres documents.

Voici un exemple:

var mongoose = require('mongoose');

var Schema = mongoose.Schema,
    ObjectId = Schema.ObjectId;
var Schema_Product = new Schema({
    categoryId  : ObjectId, // a product references a category _id with type ObjectId
    title       : String,
    price       : Number
});

Comme vous pouvez le voir, cela n'aurait pas beaucoup de sens de remplir categoryId avec un ObjectId.

Cependant, si vous voulez un champ UUID joliment nommé, mongoose fournit des propriétés virtuelles qui vous permettent de proxy (référence) un champ.

Vérifier:

var mongoose = require('mongoose');

var Schema = mongoose.Schema,
    ObjectId = Schema.ObjectId;
var Schema_Category = new Schema({
    title       : String,
    sortIndex   : String
});

Schema_Category.virtual('categoryId').get(function() {
    return this._id;
});

Alors maintenant, chaque fois que vous appelez category.categoryId, mongoose renvoie simplement le _id à la place.

Vous pouvez également créer une méthode "set" afin que vous puissiez définir des propriétés virtuelles, consultez ce lien pour plus d'informations

98
répondu addisonj 2011-11-13 18:18:09

Je cherchais une réponse différente pour le titre de la question, alors peut-être que d'autres personnes le seront aussi.

Pour définir type comme ObjectId (vous pouvez donc référencer author en tant qu'auteur de book, par exemple), vous pouvez faire comme:

const Book = mongoose.model('Book', {
  author: {
    type: mongoose.Schema.Types.ObjectId, // here you set the author ID
                                          // from the Author colection, 
                                          // so you can reference it
    required: true
  },
  title: {
    type: String,
    required: true
  }
});
20
répondu jpenna 2017-01-11 17:22:53

Ma solution sur L'utilisation de ObjectId

// usermodel.js

const mongoose = require('mongoose')
const Schema = mongoose.Schema
const ObjectId = Schema.Types.ObjectId


let UserSchema = new Schema({
   username: {
     type: String
   },
   events: [{
     type: ObjectId,
     ref: 'Event' // Reference to some EventSchema
   }]
})

UserSchema.set('autoIndex', true)

module.exports = mongoose.model('User', UserSchema)

Utiliser la méthode remplir de mongoose

// controller.js

const mongoose = require('mongoose')
const User = require('./usermodel.js')

let query = User.findOne({ name: "Person" })

query.exec((err, user) => {
  if (err) {
     console.log(err)
  }

  user.events = events
  // user.events is now an array of events
})
1
répondu dbx 2017-09-04 09:54:54

La solution fournie par @Dex a fonctionné pour moi. Mais je veux ajouter quelque chose d'autre qui a également fonctionné pour moi: Use

let UserSchema = new Schema({
   username: {
     type: String
   },
   events: [{
     type: ObjectId,
     ref: 'Event' // Reference to some EventSchema
   }]
})

Si ce que vous voulez créer est une référence de tableau. Mais si ce que vous voulez est une référence D'objet, ce que je pense que vous pourriez chercher de toute façon, supprimez les crochets de la valeur prop, comme ceci:

let UserSchema = new Schema({
   username: {
     type: String
   },
   events: {
     type: ObjectId,
     ref: 'Event' // Reference to some EventSchema
   }
})

Regardez bien les 2 extraits. Dans le second cas, la valeur prop des événements clés n'a pas de crochets sur l'objet def.

0
répondu Chukwuma Nwaugha 2017-09-19 03:53:49