Search code examples
node.jsmongodbtypescriptnestjstypegoose

Typegoose + nestjs + mongodb: index not creating using @index decorator


I am facing an error with typegoose. I have a model called SP and i have to create 2dsphere index on its property called geoLocation i tried typegoose decorator @index but it is not working even its not throwing any error, i dont know whats happing and how typegoose handles it. Is there any one who give me the solution of it 👆.

code:

import { Prop, index, modelOptions, Severity } from '@typegoose/typegoose';
import { BaseModel } from '../base.model';
import { Factory } from 'nestjs-seeder';

export enum SPStatus {
    INAVTIVE = "INAVTIVE",
    ACTIVE = "ACTIVE",
}

@modelOptions({ options: { allowMixed: Severity.ALLOW } })
@index({ geoLocation: '2dsphere' }, {})
export class SP extends BaseModel{
    @Factory(faker => faker.company.companyName())
    @Prop({ required: true, index: true, text: true })
    businessName : string
    
    @Factory(faker => {
        let data = {
            type : "Point",
            coordinates:[Number(faker.address.longitude()), Number(faker.address.latitude())]
        }
        console.log(data);

        return data;
    })
    @Prop({ required: false })
    geoLocation: {
        type: string,
        coordinates: [number]
    }
}

Solution

  • Try below code it works for me

    @index({ location: '2dsphere' })
    export class GPSData extends Typegoose{    
        
        @prop({ required: true })
        public log_Id!: mongoose.Types.ObjectId;
    
        @ValidateNested({each: true})
        @prop({
            _id : false
        })
        readonly location: Location;
    }
    
    export class Location extends Typegoose{  
       
        @prop()
        @IsString({message: " type should be text"})
        readonly type: String;
    
        @prop({ required: true })
        coordinates: [[Number]];
    }
    

    Sample collection (Type can be either one of this "Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon", and "GeometryCollection"):

    { 
    "log_Id": "5fbdec08ce02d61fec9a0189",
    
    "location":{
        "type":"MultiPoint",
        "coordinates":[
     [ -73.9580, 40.8003 ],
     [ -73.9498, 40.7968 ],
     [ -73.9737, 40.7648 ],
     [ -73.9814, 40.7681 ]
     ]  
    }
    }