web-dev-qa-db-ja.com

MongoDB:「_id」の代わりに「id」を出力

Mongoose(ノード)を使用していますが、_idの代わりにidを出力する最良の方法は何ですか?

49
Johnny

これを行うモデルにtoClient()メソッドを作成します。クライアントに送信したくない他の属性の名前を変更/削除するのにも適しています。

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

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

    return obj;
});
30
evilcelery

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アプリの作成中に上記を書きました。

85
Pascal Zajac

Mongooseの時点でv4.0この機能の一部は、そのままでサポートされています。 @Pascal Zajacで説明されているように、手動で仮想idフィールドを追加する必要はありません。

Mongooseは、デフォルトでidの仮想getterを各スキーマに割り当てます。これは、文字列、またはObjectIdの場合はhexStringにキャストされたドキュメント_idフィールドを返します。 IDゲッターをスキーマに追加したくない場合は、スキーマ構築時にこのオプションを渡して無効にします。 ソース

ただし、exportto[〜#〜] json [〜#〜]、仮想フィールドのシリアル化をenableする必要があります:

Schema.set('toJSON', {
    virtuals: true
});
26
xaviert
//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として設定することもできます。

23
user3087827

@ user3087827が提供する回答の代替バージョンを以下に示します。 schema.options.toJSONが未定義の場合、次を使用できます。

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

私はこれを使用しました:

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

Virtualsがtrueの場合、_idを自動的に抑制するといいと思います。

10
Benamar

この目的のために使いやすい plugin を作成し、それをすべてのプロジェクトとすべてのスキーマにグローバルに適用します。 _ididに変換し、__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'));

これが誰かを助けることを願っています。

5
Adam Reis

必要な要素を選択するために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']
  );
1
Ivor Scott

デフォルトのメソッドtoJSONを新しいメソッドで上書きします:

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

それを行う別のドライバーがあります http://alexeypetrushin.github.com/mongo-liteconvertIdオプションをtrueに設定します。詳細については、「デフォルトと設定」セクションを参照してください。

0

返されるアイテムを検索するときに集計関数を使用することもできます。 $ projectを使用すると、フィールドを作成して、_idに割り当てることができます。

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