Powstrzymaj Mongoose przed tworzeniem właściwości _id dla elementów tablicy pod-dokumentów

227

Jeśli masz tablice dokumentów, Mongoose automatycznie tworzy identyfikatory dla każdego z nich. Przykład:

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

Czy istnieje sposób, aby powiedzieć Mongoose, aby nie tworzył identyfikatorów obiektów w tablicy?

Atlas
źródło

Odpowiedzi:

288

To proste, możesz to zdefiniować w podchemie:

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);
throrin19
źródło
2
czy pominie to _idpola nawet w kolekcji subSchema, czy tylko w przypadku, gdy subSchema jest używana do osadzania jako tablicy elementów pod-dokumentów? Zadaję to szczególnie ze względu na moje dzisiejsze pytanie dotyczące SO.
Użytkownik sieci
1
Używam dwóch poziomów zagnieżdżonych kolekcji pod schematów. Innymi słowy, mam kolekcję subSchema podobną do twojego przykładu. W tym celu korzystam z innej kolekcji pod schematów. Chcę, aby tylko instancje modelu podschematu pierwszego poziomu nie używały identyfikatorów, ale instancje modelu podrzędnego drugiego poziomu (zagnieżdżone) muszą mieć identyfikatory. Kiedy używam twojego rozwiązania, to znaczy określając { _id: false }, oba poziomy pod-schematu są pozbawione identyfikatorów. Jest jakiś sposób obejścia tego zachowania?
Użytkownik sieci Web,
1
Próbowałeś ustawić trzeci poziom { _id : true }?
throrin19
wczoraj próbowałem zmienić to: let studentSchema = new Schema({ studentId: { type: ObjectId, ref: Student.modelName }, performance: [performanceSchema] }, { _id: false });na to: let studentSchema = new Schema({ _id: false, id: false, studentId: { type: ObjectId, ref: Student.modelName }, performance: [performanceSchema] });i to zatrzymało _idtworzenie na studentSchemazachowanym _idstworzeniu na obiektach w performancetablicy pod-dokumentów. Nie wiem, czy oba _id: falsei id: falsesą potrzebne.
Użytkownik sieci
Dzięki, najlepszy sposób dla mnie.
Swetabja Hazra
128

Możesz tworzyć dokumenty podrzędne bez schematu i unikać _id. Po prostu dodaj _id:falsedo deklaracji dokumentu podrzędnego.

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

Zapobiegnie to utworzeniu _idpola w twoim subdoc.

Testowany w Mongoose v5.9.10

Joel Grenon
źródło
42

Dodatkowo, jeśli używasz składni literału obiektu do określenia pod-schematu, możesz również dodać, _id: falseaby go wyłączyć.

{
   sub: {
      property1: String,
      property2: String,
      _id: false
   }
}
wlingke
źródło
26

Używam mangusty 4.6.3 i wszystko, co musiałem zrobić, to dodać _id: fałsz w schemacie, nie trzeba tworzyć podschemy.

{
    _id: ObjectId
    subDocArray: [
      {
        _id: false,
        field: "String"
      }
    ]
}
jemiloii
źródło
czy istnieje sposób, aby uczynić coś wyjątkowym w całej kolekcji?
Saitama,
Prawdopodobnie nie przy użyciu tej metody, ale zawsze można spróbować. _idjest polem, a nie ograniczeniem.
jemiloii
jeśli podczas tworzenia tego dokumentu podrzędnego wyraźnie nadaję _id = mongoose.Types.ObjectId(), czy to byłoby unikalne w całej kolekcji?
Saitama,
po prostu otwórz nowy przepełnienie stosu, w ten sposób możesz zmusić wiele osób do natychmiastowej odpowiedzi ~
jemiloii
4

Możesz użyć jednego z nich

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

},{ _id : false });

lub

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

});

Sprawdź swoją wersję mangusty przed skorzystaniem z drugiej opcji

Deeksha Sharma
źródło
1

Jeśli chcesz użyć predefiniowanego schematu (z _id) jako dokumentu podrzędnego (bez _id), możesz wykonać teorię w następujący sposób:

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

Ale to nie działało dla mnie. Dodałem więc, że:

delete subSourceSchema.paths._id;

Teraz mogę dołączyć subSourceSchema do mojego dokumentu nadrzędnego bez _id. Nie jestem pewien, czy jest to czysty sposób na zrobienie tego, ale działa.

Oliver White
źródło