当前位置:  开发笔记 > 编程语言 > 正文

MongoDB:输出'id'而不是'_id'

如何解决《MongoDB:输出'id'而不是'_id'》经验,为你挑选了7个好方法。

我正在使用mongoose(节点),输出id而不是_id的最佳方法是什么?



1> Pascal Zajac..:

鉴于你使用的是Mongoose,你可以使用'virtuals',它们基本上是Mongoose创建的假字段.它们不存储在数据库中,它们只是在运行时填充:

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

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

任何时候在你从这个Schema创建的模型上调用toJSON,它将包含一个'id'字段,它匹配Mongo生成的_id字段.同样,您可以以相同的方式设置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"字段.


非常好的解决方案(+1).我还要添加`Schema.set('toObject',{virtuals:true})`,以便在使用`console.log(obj)`时能够看到输出中的虚拟内容.
这会保留_id字段.我更喜欢变换解决方案,shakinfree提供的解决方案为我工作.
'toJson'仅在转换为JSON时使用.更一般的方法是使用`toObject`.http://mongoosejs.com/docs/guide.html#toObject

2> evilcelery..:

我在我的模型上创建了一个toClient()方法.它也是重命名/删除您不想发送给客户端的其他属性的好地方:

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

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

    return obj;
});


虚拟可能就是你想要的.

3> xaviert..:

从Mongoose v4.0开始,该功能的一部分支持开箱即用.id如@Pascal Zajac所解释的那样,不再需要手动添加虚拟字段.

Mongoose默认情况下为每个模式分配一个id虚拟getter,它返回文件_id字段强制转换为字符串,或者对于ObjectIds,返回其hexString.如果您不希望将ID getter添加到架构中,则可以在架构构建时禁用它以传递此选项.资源

但是,要将此字段导出JSON,仍需要启用虚拟字段的序列化:

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


这在v4.0之前就已经存在了,但OP想要的是*just*id(而不是_id)被返回.只是告诉mongoose包含虚拟id返回两者.

4> 小智..:
//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"属性来执行相反的操作,或者您可以将其设置为虚拟ID.



5> Tom Makin..:

以下是@ user3087827提供的答案的替代版本.如果您发现schema.options.toJSON未定义,那么您可以使用:

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

我认为如果它们在virtuals为true时自动抑制_id会很棒.



7> Adam Reis..:

为此,我创建了一个易于使用的插件,将其应用于所有项目以及全球所有架构。它将转换_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'));

希望这对某人有帮助。

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有