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?

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

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


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
   }
}

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"
      }
    ]
}

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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.