Pare o Mongoose de criar a propriedade _id para itens da matriz de sub-documentos


227

Se você tiver matrizes de subdocumento, o Mongoose criará automaticamente identificações para cada uma. Exemplo:

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

Existe uma maneira de dizer ao Mongoose para não criar IDs para objetos em uma matriz?

Respostas:


288

É simples, você pode definir isso no sub-esquema:

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
isso pulará os _idcampos, mesmo na coleção subSchema, ou apenas no caso em que o subSchema está sendo usado para incorporar como matriz de itens de sub-documentos? Peço isso particularmente por causa da minha própria pergunta sobre SO hoje.
Usuário Web

1
Eu uso dois níveis de coleções de sub-esquemas aninhados. Em outras palavras, eu tenho uma coleção subSchema semelhante ao seu exemplo. Dentro disso, eu uso outra coleção de sub-esquemas diferente. Quero que apenas as instâncias de modelo de sub-esquema de primeiro nível não usem IDs, mas as instâncias de modelo de sub-esquema de segundo nível (aninhadas) precisam ter IDs. Quando uso sua solução, ou seja, especificando { _id: false }, os dois níveis do sub-esquema estão sem IDs. Alguma maneira de contornar esse comportamento?
Usuário Web

1
Você já tentou, para o terceiro nível definir { _id : true }?
throrin19

o que eu tentei ontem foi mudar isso: let studentSchema = new Schema({ studentId: { type: ObjectId, ref: Student.modelName }, performance: [performanceSchema] }, { _id: false });para isso: let studentSchema = new Schema({ _id: false, id: false, studentId: { type: ObjectId, ref: Student.modelName }, performance: [performanceSchema] });e isso interrompeu a _idcriação, studentSchemamas reteve a _idcriação nos objetos na performancematriz de sub-documentos. Não tenho certeza se ambos _id: falsee id: falsesão necessários.
Usuário Web

Obrigado, melhor maneira para mim.
Swetabja Hazra 18/04

128

Você pode criar sub-documentos sem esquema e evitar _id. Basta adicionar _id:falseà sua declaração de subdocumento.

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

Isso impedirá a criação de um _idcampo no seu subdoc.

Testado em Mongoose v5.9.10


42

Além disso, se você usar uma sintaxe literal de objeto para especificar um sub-esquema, também poderá adicionar _id: falsepara suprimi-lo.

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

26

Estou usando o mangusto 4.6.3 e tudo que eu precisava fazer era adicionar _id: false no esquema, sem necessidade de criar um subesquema.

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

existe uma maneira de tornar único em toda a coleção?
Saitama

Provavelmente não com esse método, mas você sempre pode tentar. _idé um campo e não uma restrição.
precisa saber é

se durante a criação desse sub-documento, eu o atribui explicitamente _id = mongoose.Types.ObjectId(), esse _id seria único na coleção?
Saitama

basta abrir um novo estouro de pilha, desta forma você pode obter muitas pessoas para responder ao mesmo tempo ~
jemiloii

4

Você pode usar qualquer um

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

},{ _id : false });

ou

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

});

Verifique sua versão do mangusto antes de usar a segunda opção


1

Se você deseja usar um esquema predefinido (com _id) como subdocumento (sem _id), faça o seguinte na teoria:

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

Mas isso não funcionou para mim. Então eu adicionei que:

delete subSourceSchema.paths._id;

Agora eu posso incluir subSourceSchema no meu documento pai sem _id. Não sei se essa é a maneira limpa de fazer isso, mas funciona.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.