Verhindern Sie, dass Mongoose die Eigenschaft _id für Unterdokument-Array-Elemente erstellt


227

Wenn Sie Subdokument-Arrays haben, erstellt Mongoose automatisch IDs für jedes. Beispiel:

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

Gibt es eine Möglichkeit, Mongoose anzuweisen, keine IDs für Objekte in einem Array zu erstellen?

Antworten:


288

Es ist einfach, Sie können dies im Teilschema definieren:

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
Überspringt dies _idFelder auch in der SubSchema-Auflistung oder nur in dem Fall, in dem das SubSchema zum Einbetten als Array von Unterdokumentelementen verwendet wird? Ich frage dies besonders wegen meiner eigenen Frage zu SO heute.
Web User

1
Ich verwende zwei Ebenen verschachtelter Teilschemasammlungen. Mit anderen Worten, ich habe eine SubSchema-Sammlung, die Ihrem Beispiel ähnelt. Innerhalb dieser verwende ich eine andere andere Unterschemasammlung. Ich möchte, dass nur die Subschemamodellinstanzen der ersten Ebene keine IDs verwenden, aber die (verschachtelten) Subschemamodellinstanzen der zweiten Ebene müssen IDs haben. Wenn ich Ihre Lösung verwende, dh angeben { _id: false }, sind beide Ebenen des Unterschemas ohne IDs. Gibt es eine Möglichkeit, dieses Verhalten zu umgehen?
Web User

1
Haben Sie versucht, die dritte Ebene einzustellen { _id : true }?
Throrin19

Was ich gestern versucht habe, war Folgendes zu ändern: let studentSchema = new Schema({ studentId: { type: ObjectId, ref: Student.modelName }, performance: [performanceSchema] }, { _id: false });in: let studentSchema = new Schema({ _id: false, id: false, studentId: { type: ObjectId, ref: Student.modelName }, performance: [performanceSchema] });und das hat die _idErstellung der Objekte gestoppt, studentSchemaaber die _idErstellung der Objekte im performanceArray der Unterdokumente beibehalten . Nicht sicher, ob beide _id: falseund id: falsebenötigt werden.
Web-Benutzer

Danke, bester Weg für mich.
Swetabja Hazra

128

Sie können Unterdokumente ohne Schema erstellen und vermeiden _id. Fügen Sie einfach _id:falseauf Ihre Subdokument Erklärung.

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

Dadurch wird verhindert, dass _idin Ihrem Subdoc ein Feld erstellt wird.

In Mungo getestet v5.9.10


42

Wenn Sie zum Angeben eines Unterschemas eine Objektliteral-Syntax verwenden, können Sie diese auch nur hinzufügen _id: false, um sie zu unterdrücken.

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

26

Ich verwende Mungo 4.6.3 und musste lediglich _id: false im Schema hinzufügen, ohne dass ein Unterschema erstellt werden muss.

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

Gibt es eine Möglichkeit, die gesamte Sammlung einzigartig zu machen?
Saitama

Wahrscheinlich nicht mit dieser Methode, aber Sie könnten es immer versuchen. _idist eher ein Feld als eine Einschränkung.
jemiloii

Wenn ich während der Erstellung _id = mongoose.Types.ObjectId()dieses Unterdokuments explizit zuweisen würde, wäre diese ID dann in der gesamten Sammlung eindeutig?
Saitama

Öffnen Sie einfach einen neuen Stapelüberlauf, auf diese Weise können Sie viele Leute dazu bringen, gleichzeitig zu antworten ~
jemiloii

4

Sie können eine der beiden verwenden

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

},{ _id : false });

oder

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

});

Überprüfen Sie Ihre Mungo-Version, bevor Sie die zweite Option verwenden


1

Wenn Sie ein vordefiniertes Schema (mit _id) als Unterdokument (ohne _id) verwenden möchten, können Sie theoretisch wie folgt vorgehen:

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

Aber das hat bei mir nicht funktioniert. Also habe ich hinzugefügt:

delete subSourceSchema.paths._id;

Jetzt kann ich subSourceSchema ohne _id in mein übergeordnetes Dokument aufnehmen. Ich bin mir nicht sicher, ob dies der saubere Weg ist, aber es funktioniert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.