2013-06-22 9 views
130

サブ文書配列がある場合、Mongooseは自動的にそれぞれのIDを作成します。例:サブ文書配列項目の_idプロパティの作成を停止する

{ 
    _id: "mainId" 
    subdocArray: [ 
     { 
     _id: "unwantedId", 
     field: "value" 
     }, 
     { 
     _id: "unwantedId", 
     field: "value" 
     } 
    ] 
} 

は、配列内のオブジェクトのIDを作成しないためにマングースを伝える方法はありますか?

答えて

164

それはあなたがサブスキーマでこれを定義することができ、簡単です:マングースのV.3で

var mongoose = require("mongoose"); 

var subSchema = mongoose.Schema({ 
    //your subschema content 
},{ _id : false }); 

var schema = mongoose.Schema({ 
    // schema content 
    subSchemaCollection : [subSchema] 
}); 

var model = mongoose.model('tablename', schema); 
+0

これは、subSchemaコレクションでも '_id'フィールドをスキップしますか、subSchemaがサブドキュメントアイテムの配列として埋め込みに使用されている場合のみですか?私はこれを特に質問しています。私の[質問](http://stackoverflow.com/questions/38151433/mongoose-inserts-extra-id-in-array-of-objects-corresponding-to-related-entity)のSO今日。 –

+0

私は2つのレベルのネストされたサブスキーマコレクションを使用します。言い換えれば、あなたの例に似たsubSchemaコレクションがあります。その中で、別のサブスキーマコレクションを使用します。私は最初のレベルのサブスキーマモデルインスタンスにidsを使用しないようにしたいが、2番目のレベル(入れ子になった)サブスキーマモデルインスタンスにはidsが必要です。あなたのソリューションを使用すると、 '{_id:false}'を指定すると、サブスキーマの両方のレベルにidsが付きません。この現象を回避する方法はありますか? –

+1

第3レベルで '{_id:true}'を設定しようとしましたか? – throrin19

-3

今あなたが親なしでサブ文書を作成する別の方法がある - 子供との関係を。これらのサブドキュメントにはインデックスがありません

var mongoose = require("mongoose"); 

var schema = mongoose.Schema({ 
    // schema content 
subSchema: [{ 
    firstname: 'sub name', 
    lastname: 'last name' 
    }] 
}); 

var model = mongoose.model('tablename', schema); 
+1

最後に確認すると、mongooseはこれらのサブ文書にidsも追加します。 –

+0

サブIDにidsを追加する – wlingke

78

スキーマなしでサブドキュメントを作成し、_idを避けることができます。あなたのサブ文書宣言に_id:falseを追加するだけです。

var schema = new mongoose.Schema({ 
    field1:{type:String}, 
    subdocArray:[{ 
     _id:false, 
     field :{type:String} 
    }] 
}); 

これにより、サブフィールドに_idフィールドが作成されなくなります。 Mongooseでテスト済み3.8.1

24

さらに、サブスキーマを指定するためにオブジェクトリテラル構文を使用する場合は、_id: falseを追加して抑制することもできます。

{ 
    sub: { 
     property1: String, 
     property2: String, 
     _id: false 
    } 
} 
11

私はmongoose 4.6.3を使用しています。スキーマに_id:falseを追加してサブスキーマを作成する必要はありませんでした。

{ 
    _id: ObjectId 
    subdocArray: [ 
     { 
     _id: false, 
     field: "String" 
     } 
    ] 
} 
+0

コレクション全体でユニークにする方法はありますか? – Saitama

+0

おそらくこの方法ではありませんが、いつでも試してみることができます。 '_id'は制約ではなくフィールドです。 – jemiloii

+0

そのサブドキュメントの作成時に、明示的に '' '_id = mongoose.Types.ObjectId()' ''を指定すると、_idはコレクション全体で一意になりますか? – Saitama

関連する問題