Я использую mongoose (node), что является лучшим способом для вывода id вместо _id?
MongoDB: выводит 'id' вместо '_id'
Ответ 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 таким же образом.
Смотрите:
- http://mongoosejs.com/docs/api.html
- http://mongoosejs.com/docs/guide.html#toJSON
- http://mongoosejs.com/docs/guide.html#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;
});