2013-06-02 10 views
15

ネストされたオブジェクト(オブジェクトの配列など)を含むドキュメントを作成すると、各オブジェクトには独自の_idが与えられます。例えば、私のスキーマは次のようになります。Mongooseはすべてのネストされたオブジェクトに_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、アレイ内のすべてのオブジェクトは、すべてのallocationオブジェクトは、文書が最終的に作成されlists.allocations配列、であるとして、_idを与えています。これは過剰なものだと思われ、ドキュメントを膨らませますが、MongoDB(またはMongoose)がこの追加情報を入れるためにドキュメントを必要とする理由はありますか?もしそうでなければ、_idがルート文書にあるように、それが起こらないようにしたいと思います。

さらに、idのはクライアントコードで必要となるため、_idの仮想番号が自動的に作成されます。これが私がJSONで返されたバーチャルを持っている理由です。しかし、文書全体には_idのフィールドが存在するので、このバーチャルはすべてのものを複製します。追加の_idフィールドを防ぐ方法がない場合、どのように仮想ドキュメントを_idにのみ適用することができますか?それとも、私がやろうとしていることをするより良い方法があれば、それは何でしょうか?

答えて

11

同じテクニックで両方の問題を解決する方法を見つけました。それぞれのネストされたオブジェクトタイプに明示的なスキーマを使用し、_ididのオプションをfalseに設定しました。 Mongooseは、インラインで定義したオブジェクトを入れ子にしたときに、その背後にある各オブジェクトのスキーマを作成するようです。スキーマのデフォルトは_id: trueid: trueなので、_idとなり、仮想idになります。しかし、これを明示的なスキーマで上書きすることで、_idの作成を制御できます。より多くのコードが、私は私が欲しいものを得る:情報への感謝@neverfox

mongoose = require "mongoose" 

Schema = mongoose.Schema 

AllocationSchema = new Schema 
    allocation: 
    type: Number 
    required: true 
, 
    _id: false 
    id: false 

mongoose.model "Allocation", AllocationSchema 

ListsSchema = new Schema 
    list: 
    type: Schema.Types.ObjectId 
    required: true 
    ref: "List" 
    allocations: [AllocationSchema] 
, 
    _id: false 
    id: false 

mongoose.model "Lists", ListsSchema 

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

    lists: [ListsSchema] 

    createdAt: 
    type: Date 
    default: Date.now 

    updatedAt: 
    type: Date 
+11

のためのコードを追加し、私は単純に_idを追加することができています:偽別のサブスキーマを作成する必要なくメインのスキーマの右のサブ文書に追加 – cyberwombat

+1

JavaScriptソリューションをお探しの場合:http://stackoverflow.com/questions/17254008/stop-mongoose-from-created-ids-for- subdocument-arrays –

2

、私はちょうどバージョン(3.6)では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], 
}); 
+0

FYIサブ文書の_idの値に{id:false}の代わりにfalseを使用することができました –

関連する問題