import { Schema , model , ObjectId } from 'mongoose' ; import { composeMongoose } from 'graphql-compose-mongoose' ; import { schemaComposer } from '../schemaComposer' ; const LanguagesSchema = new Schema ( { language : String , skill : { type : String , enum : [ 'basic' , 'fluent' , 'native' ] , } , } , { _id : false , } ) ; const AddressSchema = new Schema ( { street : String , geo : { type : [ Number ] , index : '2dsphere' , } , } ) ; export const UserSchema = new Schema ( { name : { type : String , index : true , } , age : { type : Number , index : true , } , languages : { type : [ LanguagesSchema ] , default : [ ] , } , contacts : { email : String , phones : [ String ] , } , gender : { type : String , enum : [ 'male' , 'female' , 'ladyboy' ] , } , address : { type : AddressSchema , } , someMixed : { type : Schema . Types . Mixed , description : 'Some dynamic data' , } , salaryDecimal : { type : Schema . Types . Decimal128 , index : true , } , } , { collection : 'user_users' , } ) ; export class UserDoc { _id : ObjectId ; name : string ; age : number ; languages : Array < { language : string ; skill : 'basic' | 'fluent' | 'native' ; } > ; contacts : { email : string ; phones : string [ ] ; } ; gender : 'male' | 'female' ; address ? : any ; someMixed ? : any ; salaryDecimal ? : any ; } UserSchema . index ( { gender : 1 , age : - 1 } ) ; export const User = model < any > ( 'User' , UserSchema ) ; export const UserTC = composeMongoose ( User , { schemaComposer } ) ; UserTC . addFields ( { virtualField : { type : 'String' , args : { lang : 'String' , } , resolve : ( source , args , context , info ) => { return source . contacts . email + context . ip + info . fieldName ; } , } , } ) ;