NodeJS: Mongoose jak zapobiegać dodawania identyfikatora do zagnieżdżonego dokumentu?

Opublikowano: 29.12.2022 - tagi: NodeJS Baza danych Mongoose Model Dokument JavaScript TypeScript

Zagnieżdżone dokumenty

Mongoose pozwala na dodawanie zagnieżdżonych dokumentów do kolekcji:

import { model, Schema } from 'mongoose';

export interface Tag {
    name: string;
    value: string;
}

export interface Product {
    title: string;
    description: string;
    tags: Tag[];
}

const ProductSchema = new Schema<Product>({
    title: { type: String, required: true },
    description: { type: String, required: true },
    tags: { type: [{
            name: { type: String, required: true },
            value: { type: String, required: true },
        }],
        default: () => []
    }
}, { versionKey: false });

export const ProductModel = model('Product', ProductSchema);

Kiedy dodamy do kolekcji nowy rekord:

const productToAdd: Product = {
    title: 'Some product',
    description: 'Lorem ipsum',
    tags: [
        { name: 'Tag 1', tag: 'tag1' },
        { name: 'Tag 2', tag: 'tag2' },
    ]
};

const addedProduct: Product = await ProductModel.create(productToAdd);
console.log(addedProduct);

Powstanie coś takiego:

{
    _id: '5c2dcec42161327d7bf6bd63',
    title: 'Some product',
    description: 'Lorem ipsum',
    tags: [
        { 
            _id: '5caa542e2161327d7bf6c086'  
            name: 'Tag 1',
            tag: 'tag1' 
        },
        { 
            _id: '5cb183c82161327d7bf6c097',
            name: 'Tag 2', 
            tag: 'tag2'
        },
    ]
};

Po utworzeniu nowego dokumentu do rekordu zostały dodane trzy pola: _id. Jak pozbyć się identyfikatorów w zagnieżdżonym dokumencie (tags), jeśli ich nie potrzebujemy?

Zapobieganie dodawania identyfikatorów

Rozwiązanie jest banalne. Wróćmy do definicji naszego modelu. Skupmy się problematycznym tags:

tags: { 
    type: [{
        _id: false, // Ustawiamy flagę
        name: { type: String, required: true },
        value: { type: String, required: true },
    }],
    default: () => []
}

Jak widać, wystarczy dodać pole: _id: false, aby pozbyć się niechcianych identyfikatorów!