Запрос Mongodb для удаления избыточных полей с отметкой времени менее 1 se c из окончательного результата - PullRequest
0 голосов
/ 07 января 2020

Название коллекций, которые у меня есть
1) Устройство: _id, deviceId (строка), deviceInfo, companyId (строка)

2) Мобильный телефон: _id, companyId (строка), tagId (строка), mobileInfo

3) Отслеживание: _id, DeviceID (строка), TagID (строка), trackInfo, метка времени (в миллисекундах * 1039) *)

Мне нужно создать запрос, чтобы получить все данные отслеживания (с мобильными данными и данными устройства) данного companyId. Каждая компания имеет:

  1. Одна или несколько мобильных данных с различным tagId.
  2. Одна или несколько данных устройства с deviceId.
  3. Одна или несколько данных отслеживания, идентифицированных TagID и DeviceID.

Окончательный результат должен содержать поля, перечисленные ниже: DeviceID, deviceInfo, companyId, TagID, mobileInfo, trackInfo, Timestamp.
Условие, применяемое к запросу:
Отслеживающие коллекции могут иметь документы каждую секунду, бывают случаи, когда все поля одинаковы (за исключением того, что метка времени отличается на 1 сек c). Я не хочу, чтобы эти избыточно выглядящие документы, для достижения этой цели, мы можем использовать условие как: Если соседние строки конечных результатов одинаковы с разницей их отметки времени или без нее, то разница меньше 1 se c, тогда одна из строк не должна быть в конечном результате. У меня есть работа запрос, который будет возвращать документы с полями выше, но для поведения избыточности я проверил после применения запроса, используя l oop для документов, возвращаемых запросом, как показано ниже. Теперь мне нужно реализовать следующие логи c для самого запроса.
Примечание : отслеживание коллекций имеет миллионы документов, поэтому остерегайтесь запроса, который может повлиять на производительность.

// grid is the array of documents returned by mongodb using query.
for (var k=1;k<grid.length;){
    var a=Number(grid[k].Timestamp);
    var b=Number(grid[k-1].Timestamp)
    if ((Math.abs(a - b)<(1000)) && grid[k].TagID===grid[k-1].TagID && grid[k].DeviceID===grid[k-1].DeviceID){
        grid.splice(k, 1);
    }
    else{
        k++;
    }
}

    
for (var k=1;k<grid.length-1;){
    if ((grid[k].DeviceID===grid[k-1].DeviceID && grid[k].TagID===grid[k-1].TagID) && (grid[k].DeviceID===grid[k+1].DeviceID && grid[k].TagID===grid[k+1].TagID)){
        grid.splice(k, 1);
    }
    else{
        k++;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...