web-dev-qa-db-fra.com

Comment définir _id en document db dans Mongoose?

J'essaie de créer dynamiquement des _id pour mes modèles Mongoose en comptant les documents dans la base de données et en utilisant ce nombre pour créer le _id (en supposant que le premier _id est 0). Cependant, je ne peux pas obtenir le _id à définir à partir de mes valeurs. Voici mon code:

//Schemas
var Post = new mongoose.Schema({
    //_id: Number,
    title: String,
    content: String,
    tags: [ String ]
});

var count = 16;

//Models
var PostModel = mongoose.model( 'Post', Post );

app.post( '/', function( request, response ) {

    var post = new PostModel({
        _id: count,
        title: request.body.title,
        content: request.body.content,
        tags: request.body.tags
    });

    post.save( function( err ) {
        if( !err ) {
            return console.log( 'Post saved');
        } else {
            console.log( err );
        }
    });

    count++;

    return response.send(post);
});

J'ai essayé de définir le _id de différentes manières, mais cela ne fonctionne pas pour moi. Voici la dernière erreur:

{ message: 'Cast to ObjectId failed for value "16" at path "_id"',
  name: 'CastError',
  type: 'ObjectId',
  value: 16,
  path: '_id' }

Si vous savez ce qui se passe, faites-le moi savoir.

30
EmptyArsenal

Vous devez soit déclarer le _id dans le cadre de votre schéma (vous l'avez commenté), ou utilisez le _id et définissez-la sur false (vous utilisez l'option id, qui crée un getter virtuel pour convertir _id à une chaîne mais toujours créé un _id Propriété ObjectID, d'où l'erreur de transtypage que vous obtenez).

Donc, soit ceci:

var Post = new mongoose.Schema({
    _id: Number,
    title: String,
    content: String,
    tags: [ String ]
});

Ou ca:

var Post = new mongoose.Schema({
    title: String,
    content: String,
    tags: [ String ]
}, { _id: false });
36
robertklep

La première partie du code de @ robertklep ne fonctionne pas pour moi (mangouste 4), vous devez également désactiver _id

var Post = new mongoose.Schema({
  _id: Number,
  title: String,
  content: String,
  tags: [ String ]
}, { _id: false });

et cela fonctionne pour moi

11
Tim Qian

Créez un _id personnalisé dans mangouste et enregistrez cet ID en tant que mongo _id. Utilisez mongo _id avant d'enregistrer des documents comme celui-ci.

const mongoose = require('mongoose');
    const Post = new mongoose.Schema({
          title: String,
          content: String,
          tags: [ String ]
        }, { _id: false });

// request body to save

let post = new PostModel({
        _id: new mongoose.Types.ObjectId().toHexString(), //5cd5308e695db945d3cc81a9
        title: request.body.title,
        content: request.body.content,
        tags: request.body.tags
    });


post.save();
0
jenish