Подтвердить что ты не робот

MongoDB: выводит 'id' вместо '_id'

Я использую mongoose (node), что является лучшим способом для вывода id вместо _id?

4b9b3361

Ответ 1

Я создаю метод toClient() для своих моделей, где я это делаю. Это также хорошее место для переименования/удаления других атрибутов, которые вы не хотите отправлять клиенту:

Schema.method('toClient', function() {
    var obj = this.toObject();

    //Rename fields
    obj.id = obj._id;
    delete obj._id;

    return obj;
});

Ответ 2

Учитывая, что вы используете Mongoose, вы можете использовать "виртуальные", которые по сути являются поддельными полями, создаваемыми Mongoose. Они не хранятся в БД, они просто заполняются во время выполнения:

// Duplicate the ID field.
Schema.virtual('id').get(function(){
    return this._id.toHexString();
});

// Ensure virtual fields are serialised.
Schema.set('toJSON', {
    virtuals: true
});

В любое время toJSON вызывается в модели, которую вы создаете из этой схемы, она будет содержать поле "id", которое соответствует полю _id, создаваемому Mongo. Аналогичным образом вы можете установить поведение для toObject таким же образом.

Смотрите:

Вы можете абстрагировать это в BaseSchema на всех своих моделях, а затем продлить/вызывать, чтобы поддерживать логику в одном месте. Я написал выше, создав приложение Ember/ Node/Mongoose, так как Ember действительно предпочитает иметь поле "id" для работы.

Ответ 3

//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;
}

существует свойство Schema.options.toObject.transform, чтобы сделать обратное, или вы можете просто установить его как виртуальный.

Ответ 4

По сравнению с Mongoose v4.0 часть этой функциональности поддерживается из коробки. Больше не требуется вручную добавлять виртуальное поле id, как объясняется @Pascal Zajac.

Mongoose присваивает каждой из ваших схем виртуальный приемник id по умолчанию который возвращает поле _id документов, переданное в строку, или в случае ObjectIds, его hexString. Если вы не хотите, чтобы идентификатор getter добавлен в вашей схеме, вы можете отключить его, передав этот параметр в схеме время строительства. Источник

Однако, чтобы экспортировать это поле в JSON, по-прежнему требуется включить сериализацию виртуальных полей:

Schema.set('toJSON', {
    virtuals: true
});

Ответ 5

Вот альтернативная версия ответа, предоставленного @user3087827. Если вы обнаружите, что schema.options.toJSON - undefined, вы можете использовать:

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

Ответ 6

Я использовал это:

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

Я думаю, было бы здорово, если бы они автоматически подавляли _id, когда виртуальные файлы истинны.

Ответ 7

Я создал простой для использования плагин для этой цели, который я применяю ко всем моим проектам и ко всей схеме по всему миру. Он преобразует _id в id и также разбивает параметр __v.

Итак, он преобразует:

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

Для более простого и чистого:

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

Использование глобального плагина:

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

Или для конкретной схемы:

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

Надеюсь, это поможет кому-то.

Ответ 8

Если вы используете lodash, чтобы выбрать нужные элементы, это сработает для вас.

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

Там есть другой драйвер, который делает http://alexeypetrushin.github.com/mongo-lite значение convertId равным true. Подробнее см. Раздел "По умолчанию и настройка".

Ответ 10

Вы также можете использовать агрегатную функцию при поиске возвращаемых элементов. $project позволит вам создавать поля, которые вы можете сделать, и назначить их _id.

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

Ответ 11

toJSON метод по умолчанию toJSON новым:

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