Estoy usando la mangosta (nodo), ¿cuál es la mejor manera para la salida de id en lugar de _id?

  • Para los nuevos lectores: a continuación, puedes ver varios enfoques diferentes. Es conveniente leer todos ellos antes de la elección, en lugar de seguir ciegamente va por aceptada o mayoría de votos. Saludos!
InformationsquelleAutor Johnny | 2011-08-12

11 Comentarios

  1. 30

    Puedo crear un toClient() método en mis modelos donde puedo hacer esto. Es también un buen lugar para renombrar/eliminar otros atributos que usted no desea enviar al cliente:

    Schema.method('toClient', function() {
        var obj = this.toObject();
    
        //Rename fields
        obj.id = obj._id;
        delete obj._id;
    
        return obj;
    });
    • Yo realmente nuevo a la mangosta, esto se parece a lo que yo quiero. ¿cómo se llama este toClient? Hago normalmente, find(), y obtener una docs objeto, a continuación, sólo hacer res.enviar(docs). Así que en este caso, ¿debo llamar a res.escribir(docs[1].toClient()) en cada uno de los doc? gracias
    • esto no parece funcionar para mí ahora – tiene el método para hacer esto en la Mangosta cambiado?
    • virtuals es probablemente lo que usted desea.
  2. 84

    Dado que usted está utilizando la Mangosta, puede usar ‘virtuals’, que son esencialmente falso campos que Mangosta crea. No están almacenados en la base de datos, que acaban de llegar poblada en tiempo de ejecución:

    //Duplicate the ID field.
    Schema.virtual('id').get(function(){
        return this._id.toHexString();
    });
    
    //Ensure virtual fields are serialised.
    Schema.set('toJSON', {
        virtuals: true
    });

    Cualquier momento toJSON se llama en el Modelo se puede crear a partir de este Esquema, se incluirá un campo ‘id’ que coincide con el campo _id Mongo genera. Del mismo modo se puede establecer el comportamiento de toObject de la misma manera.

    Ver:

    Puede abstracto en un BaseSchema todos sus modelos, a continuación, extender/invoke para mantener la lógica en un solo lugar. Yo escribí lo anterior, mientras que la creación de una Brasa/Node/Mangosta de la aplicación, desde el Ascua realmente prefiere tener un campo ‘id’ para trabajar con.

    • +1 funcionado bien para mí
    • Una solución muy buena (+1). También me gustaría añadir Schema.set('toObject', { virtuals: true }) a ser capaz de ver virtuals en la salida cuando el uso de console.log(obj).
    • Esto mantiene el campo _id. Yo prefiero la transformación de la solución en lugar de ello, el proporcionado por shakinfree trabajó para mí.
    • ‘toJson’ es sólo cuando se convierte en JSON. El enfoque más general sería el uso de toObject. mongoosejs.com/docs/guide.html#toObject
    • Reducido mi mayor dolor de cabeza, saludos!!
    • Yo estaba colocado en el modelo, no funciona, donde puedo colocarlo? coloca debajo de este const companyCollection = mongoose.Schema({}); utilizando ExpressJs
    • En la última versión de la Mangosta (5.4.20 en este momento) hay un virtual id getter incluido/prediseñadas en el API. mongoosejs.com/docs/guide.html#id

  3. 23
    //Transform
    Schema.options.toJSON.transform = function (doc, ret, options) {
      //remove the _id of every document before returning the result
      ret.id = ret._id;
      delete ret._id;
      delete ret.__v;
    }

    hay un «Esquema.opciones.toObject.transformar» la propiedad no a la inversa o usted podría configurar como una identidad virtual.

    • Gracias por esto!
  4. 23

    Como de la Mangosta v4.0 parte de esta funcionalidad es apoyado fuera de la caja. Ya no es necesario agregar manualmente una virtual id campo como explica @Pascal Zajac.

    Mangosta asigna a cada uno de sus esquemas de un identificador virtual getter por defecto
    que devuelve los documentos de campo _id arrojado a una cadena, o en el caso
    de ObjectIds, su hexString. Si usted no quiere un id de captador añadido a
    su esquema, puede desactivar la función de pasar esta opción en el esquema de la
    el tiempo de construcción. Fuente

    Sin embargo, a exportación este campo para JSON, es todavía necesario para habilitar serialización de campos virtuales:

    Schema.set('toJSON', {
        virtuals: true
    });
    • Esto era cierto, mucho antes de que v4.0, pero lo que el OP quiere es que solo id (y no _id) para ser devueltos. Simplemente decirle a la mangosta para incluir la identidad virtual devuelve.
    • ¿Qué pasa si usted tiene otras virtuals desea excluir?
  5. 20

    Aquí es una versión alternativa de la respuesta proporcionada por @user3087827. Si usted encuentra que schema.options.toJSON es indefinido, a continuación, puede utilizar:

    schema.set('toJSON', {
         transform: function (doc, ret, options) {
             ret.id = ret._id;
             delete ret._id;
             delete ret.__v;
         }
    }); 
  6. 10

    He usado este :

    schema.set('toJSON', {
      virtuals: true,
      versionKey:false,
      transform: function (doc, ret) {   delete ret._id  }
    });

    Creo que sería genial si ellos suprimir automáticamente _id cuando virtuals es cierto.

  7. 4

    He creado un fácil utilizar el plugin para este propósito que puedo aplicar para todos mis proyectos y a todos los del esquema global. Convierte _id a id y tiras de la __v parámetro.

    Por lo que convierte:

    {
      "_id": "400e8324a71d4410b9dc3980b5f8cdea",
      "__v": 2,
      "name": "Item A"
    }

    A una más limpia y sencilla:

    {
      "id": "400e8324a71d4410b9dc3980b5f8cdea",
      "name": "Item A"
    }

    Uso como un plugin global:

    const mongoose = require('mongoose');
    mongoose.plugin(require('meanie-mongoose-to-json'));

    O para un esquema específico:

    const mongoose = require('mongoose');
    const Schema = mongoose.Schema;
    const MySchema = new Schema({});
    MySchema.plugin(require('meanie-mongoose-to-json'));

    Espero que esto ayude a alguien.

  8. 1

    Si usted está usando lodash para elegir los elementos que desea, esto funcionará para usted.

    UserSchema.virtual('id').get(function(){
      return this._id.toHexString();
    });
    
    UserSchema.set('toObject', { virtuals: true })
    
    UserSchema.methods.toJSON = function() {
      return _.pick( 
        this.toObject(), 
        ['id','email','firstName','lastName','username']
      );
  9. 0

    También puede utilizar la función de agregado cuando se buscan elementos para volver. $proyecto le permitirá crear campos, que se puede hacer y asignarlo a _id.

    <model>.aggregate([{$project: {_id: 0, id: '$_id'}], (err, res) => {
     //
    })
  10. 0

    Sobrescribir el método predeterminado toJSON por uno nuevo:

    schema.method('toJSON', function () {
       const { __v, _id, ...object } = this.toObject();
       object.id = _id;
       return object;
    });

Dejar respuesta

Please enter your comment!
Please enter your name here