Mongooseがサブドキュメント配列項目の_idプロパティを作成しないようにする


227

サブドキュメント配列がある場合、MongooseはそれぞれにIDを自動的に作成します。例:

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

配列内のオブジェクトのIDを作成しないようにMongooseに指示する方法はありますか?

回答:


288

簡単です、これをサブスキーマで定義できます:

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);

2
これ_idはsubSchemaコレクションでもフィールドをスキップしますか、またはsubSchemaがサブドキュメントアイテムの配列として埋め込むために使用されている場合のみですか?今日私がSO について自分自身の質問があるので、私はこれを特に尋ねます。
Webユーザー

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

1
3番目のレベルを設定するために、試してみました{ _id : true }か?
throrin19

私が昨日試したのは、これを次のlet studentSchema = new Schema({ studentId: { type: ObjectId, ref: Student.modelName }, performance: [performanceSchema] }, { _id: false });ように変更することです。これにより、サブドキュメントの配列内のオブジェクトの作成はlet studentSchema = new Schema({ _id: false, id: false, studentId: { type: ObjectId, ref: Student.modelName }, performance: [performanceSchema] });停止し_idましたstudentSchema_id、オブジェクトの作成は保持されましたperformance_id: falseとの両方id: falseが必要かどうかは不明です。
Webユーザー

ありがとう、私にとって最善の方法。
Swetabja Hazra

128

スキーマなしでサブドキュメントを作成し、を回避できます_id_id:falseサブドキュメント宣言に追加するだけです。

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

これにより、_idサブドキュメントにフィールドが作成されなくなります。

マングースでテスト済み v5.9.10


42

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

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

26

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

{
    _id: ObjectId
    subDocArray: [
      {
        _id: false,
        field: "String"
      }
    ]
}

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

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

そのサブドキュメントの作成中に私が明示的に割り当てた_id = mongoose.Types.ObjectId()場合、その_idはコレクション全体で一意になりますか?
埼玉

ただ、あなたは多くの人が一度に〜答えるために得ることができ、このように新しいスタックオーバーフローを開く
jemiloii

4

どちらでも使えます

var subSchema = mongoose.Schema({
//subschema fields    

},{ _id : false });

または

var subSchema = mongoose.Schema({
//subschema content
_id : false    

});

2番目のオプションを使用する前にマングースのバージョンを確認してください


1

定義済みのスキーマ(_idあり)をサブドキュメント(_idなし)として使用する場合は、理論的には次のようにします。

const sourceSchema = mongoose.Schema({
    key : value
})
const subSourceSchema = sourceSchema.clone().set('_id',false);

しかし、それは私にはうまくいきませんでした。だから私はそれを追加しました:

delete subSourceSchema.paths._id;

これで、_idなしでsubSourceSchemaを親ドキュメントに含めることができます。これがクリーンな方法かどうかはわかりませんが、うまくいきます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.