web-dev-qa-db-fra.com

Comment définir ObjectId en tant que type de données en mangouste

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

var mongoose = require('mongoose');

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

Je cours ensuite

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 mangouste utilisera le schéma pour le générer mais le document a les habituels "_id" et non "categoryId" Qu'est-ce que je fais mal?

50
idophir

Contrairement aux RBDM traditionnels, mongoDB ne vous permet pas de définir un champ aléatoire en tant que clé primaire. Le champ _id DOIT exister pour tous les documents standard.

Pour cette raison, il n’a pas de sens de créer un champ uuid séparé.

En mangouste, le type ObjectId est utilisé pour ne pas créer de nouveau uuid, mais plutôt pour faire référence à 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 constater, il n’aurait pas beaucoup de sens de renseigner categoryId avec un ObjectId.

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

Vérifiez-le:

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, mangouste renvoie simplement le _id.

Vous pouvez également créer une méthode "set" pour pouvoir définir des propriétés virtuelles, consultez ce lien Pour plus d'informations.

100
addisonj

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

Pour définir le type en tant que ObjectId (afin que vous puissiez référencer author en tant qu'auteur de book, par exemple), vous pouvez procéder comme suit:

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
  }
});
21
jpenna

Ma solution pour utiliser 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)

Utilisation de la méthode populate de la mangouste

// 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
dbx

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

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

si vous voulez créer une référence à un tableau. Mais si ce que vous voulez, c'est une référence à un objet, ce que je pense que vous cherchiez de toute façon, supprimez les crochets de la propriété value, 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 parenthèse sur l'objet def.

0
Chukwuma Nwaugha