22

ネストされたオブジェクト (オブジェクトの配列など) を含むドキュメントを作成する場合、各オブジェクトには独自の _id が与えられます。たとえば、私のスキーマは次のようになります。

mongoose = require "mongoose"

Schema = mongoose.Schema

schema = new Schema
  name:
    type: String
    required: true
    unique: true
    trim: true

  lists: [
    list:
      type: Schema.Types.ObjectId
      required: true
      ref: "List"
    allocations: [
      allocation:
        type: Number
        required: true
    ]
  ]

  createdAt:
    type: Date
    default: Date.now

  updatedAt:
    type: Date

# Ensure virtual fields are serialised.
schema.set "toJSON",
  virtuals: true

exports = module.exports = mongoose.model "Portfolio", schema

ドキュメントが最終的に作成されるときに、配列内のすべてのオブジェクトと同様に、配列内のすべてのオブジェクトにlists_id が与えられます。これはやり過ぎでドキュメントを肥大化させるように思えますが、MongoDB (または Mongoose) がドキュメントにこの追加情報を含める必要がある理由はありますか? そうでない場合は、唯一の _id がルート ドキュメントにあるように、それが起こらないようにしたいと思います。allocationlists.allocations

さらに、Mongoose は仮想idfor を自動的に作成します。_idこれは、クライアント コードが field を想定しているため必要ですid。これが、仮想を JSON で返す理由です。ただし、_idルートだけでなくドキュメント全体にフィールドがあるため、この仮想はそれらすべてを複製します。追加の _id フィールドを防ぐ方法がない場合、仮想をルート ドキュメントの _id のみに適用するにはどうすればよいですか? または、私がやろうとしていることを行うためのより良い方法がある場合、それは何でしょうか?

4

2 に答える 2

8

@neverfox情報をありがとう、Nodejsのコードを追加しただけです

var _incidents = mongoose.Schema({
  name : {type : String},
  timestamp: {type : Number},
  _id : {id:false}
});


_schema = mongoose.Schema({
   _id: {type: String, required: true},
   user_id: {type: String, required: true}, 
   start_time: {type: Number, required: true},  
    incidents : [_incidents],
});
于 2016-04-15T06:02:14.513 に答える