Mongoose(ノード)を使用していますが、_idの代わりにidを出力する最良の方法は何ですか?
これを行うモデルにtoClient()メソッドを作成します。クライアントに送信したくない他の属性の名前を変更/削除するのにも適しています。
Schema.method('toClient', function() {
var obj = this.toObject();
//Rename fields
obj.id = obj._id;
delete obj._id;
return obj;
});
Mongooseを使用している場合、「仮想」を使用できます。これは、基本的にMongooseが作成する偽のフィールドです。これらはDBに保存されず、実行時に設定されます。
// Duplicate the ID field.
Schema.virtual('id').get(function(){
return this._id.toHexString();
});
// Ensure virtual fields are serialised.
Schema.set('toJSON', {
virtuals: true
});
このスキーマから作成したモデルでtoJSONが呼び出されるたびに、Mongoが生成する_idフィールドと一致する「id」フィールドが含まれます。同様に、同じ方法でtoObjectの動作を設定できます。
見る:
これをすべてのモデルのBaseSchemaに抽象化してから、ロジックを1か所に保持するために拡張/起動できます。 Emberは実際に「id」フィールドを使用することを好むため、Ember/Node/Mongooseアプリの作成中に上記を書きました。
Mongooseの時点でv4.0この機能の一部は、そのままでサポートされています。 @Pascal Zajacで説明されているように、手動で仮想id
フィールドを追加する必要はありません。
Mongooseは、デフォルトでidの仮想getterを各スキーマに割り当てます。これは、文字列、またはObjectIdの場合はhexStringにキャストされたドキュメント_idフィールドを返します。 IDゲッターをスキーマに追加したくない場合は、スキーマ構築時にこのオプションを渡して無効にします。 ソース
ただし、exportto[〜#〜] json [〜#〜]、仮想フィールドのシリアル化をenableする必要があります:
Schema.set('toJSON', {
virtuals: true
});
//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として設定することもできます。
@ user3087827が提供する回答の代替バージョンを以下に示します。 schema.options.toJSON
が未定義の場合、次を使用できます。
schema.set('toJSON', {
transform: function (doc, ret, options) {
ret.id = ret._id;
delete ret._id;
delete ret.__v;
}
});
私はこれを使用しました:
schema.set('toJSON', {
virtuals: true,
versionKey:false,
transform: function (doc, ret) { delete ret._id }
});
Virtualsがtrueの場合、_idを自動的に抑制するといいと思います。
この目的のために使いやすい plugin を作成し、それをすべてのプロジェクトとすべてのスキーマにグローバルに適用します。 _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'));
これが誰かを助けることを願っています。
必要な要素を選択するために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']
);
デフォルトのメソッドtoJSON
を新しいメソッドで上書きします:
schema.method('toJSON', function () {
const { __v, _id, ...object } = this.toObject();
object.id = _id;
return object;
});
それを行う別のドライバーがあります http://alexeypetrushin.github.com/mongo-liteconvertId
オプションをtrueに設定します。詳細については、「デフォルトと設定」セクションを参照してください。
返されるアイテムを検索するときに集計関数を使用することもできます。 $ projectを使用すると、フィールドを作成して、_idに割り当てることができます。
<model>.aggregate([{$project: {_id: 0, id: '$_id'}], (err, res) => {
//
})