Мне нужно найти () объект, где (время) .gte (). Lte () запрос в мангусте, используя nest.js и машинопись - PullRequest
0 голосов
/ 10 октября 2019

Мне нужно найти все объекты geoLocation, у которых в качестве свойств указаны даты, которые находятся между диапазоном, переданным из интерфейса.

Это моя схема Мангуста:

export const MobileDeviceSchema = new Schema<IMobileDeviceDocument>({
    duid: {
        type: Schema.Types.String,
        required: true,
        index: true
    },
    pushId: {
        type: Schema.Types.String,
        // required: false,
        index: true
    },
    packs: [
        {
            type: Schema.Types.ObjectId,
            ref: 'DevicePack'
        }
    ],
    firstName: Schema.Types.String,

    role: {
        type: Schema.Types.String,
        enum: ['GUEST', 'PARENT', 'CHILD'],
    },
    createdAt: {
        type: Schema.Types.Date,
        default: new Date()
    },
    lastUpdated: {
        type: Schema.Types.Date,
        default: new Date()
    },
    lastLoggedAt: Schema.Types.Date,

    actions: {
        type: Schema.Types.Array,
    },

    geoLocation: [
        {
            latitude: {
                type: Schema.Types.String,
                required: true
            },
            altitude: {
                type: Schema.Types.String,
                required: true
            },
            longitude: {
                type: Schema.Types.String,
                required: true
            },
            speed: {
                type: Schema.Types.Number,
                required: true
            },
            time: {
                type: Schema.Types.Date,
                required: true,
                default: new Date()
            },
        }
    ],

    img: {
        type: Schema.Types.Mixed
    }


})

Это то, что я получаю от внешнего интерфейса:

{ 
   dateFrom: '2019-10-02T13:54:26.017Z',
   dateTo: '2019-10-02T13:54:26.017Z',
   count: '' 
}

И это мое вспомогательное обслуживание:

async findOnesGeo2(id: string, mobileDevice: {
        dateFrom: Date
        dateTo: Date
        count: number
    }): Promise<any> {
        this.logger.log(`Try to find a Mobile Device...`);

        let dateFrom = new Date(mobileDevice.dateFrom)
        let dateTo = new Date(mobileDevice.dateTo)
        const count = mobileDevice.count
        let geoLocPre = []
        let geoLocToShow = []
        // let mobileDeviceFromDB = await this.mobileDeviceModel.findById(id).exec();



        let found3 = await this.mobileDeviceModel.find({ _id: id }).select('geoLocation').where("time").gte(dateFrom).lte(dateTo)
        console.log("found3: ", found3)


        return found3
    }

Итак, у нас есть

  • mobileDeviceModel, который имеет массив с именем geoLocation, который содержит сотни (geoLocation)objects, и каждый из этих (объектов) имеет свойство с именем time, котороеимеет тип Date.

Я пытался написать этот запрос несколькими способами.

Сначала я попытался использовать 'findById (id)', но потом заметил, что яМне не разрешено запрашивать больше, когда я использую findById (id).

Затем я попытался использовать find () и findOne (), передав идентификатор в качестве объекта find ({_id: id}, изатем больше информации, чтобы получить конкретные даты.

Я попытался выбрать (геолокация), но затем я теряю часть информации, которую я имею за пределамимассив eoLocation, который мне тоже нужен. Например, img и фамилия ...

Я пытался $where, но застрял с функцией, которую я должен предоставить.

Я пытался .where(geoLocation) AND

Я попытался .where(geoLocation.time), но ничего.

Я получаю массив с целым mobileDeviceObject без сортировки по дате, когда я пытаюсь это сделать так:

let found3 = await this.mobileDeviceModel.find({ _id: id }).select('geoLocation').where("time")

ИЛИ

Я получаю пустой массив [], когда я пытаюсь сделать это следующим образом:

let found3 = await this.mobileDeviceModel.find({ _id: id }).select('geoLocation').where("time").gte(dateFrom)

Возможно ли то, что я пытаюсь сделать?

Заранее спасибо!

...