Мне нужно найти все объекты 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)
Возможно ли то, что я пытаюсь сделать?
Заранее спасибо!