2016-08-03 2 views
2

Я совершенно новой для NoSQL и изо всех сил, чтобы написать этот запрос Я использую Мангуст на Node.jsНайти последнюю запись на основании группы Mongoose

То, что я хочу добиться того, чтобы получить один последний результат на основе группы идентификатора устройства. У меня нетрудно написать это в SQL, но с трудом делаю это в NoSQL.

Вот настройка модели

_id  DeviceID  Coordinate:{lat, long} 
1  2   lat: 1, long: 2 
2  3   lat: 2, long: 3 
3  1   lat: 3, long: 3 
4  3   lat: 5, long: 4 
5  2   lat: 7, long: 5 
6  2   lat: 9, long: 6 
7  3   lat: 111, long: 7 
8  2   lat: 113, long: 8 

Вывод, который я хочу это:

_id  DeviceID  Coordinate:{lat, long} 
3  1   lat: 3, long: 3 
7  3   lat: 111, long: 7 
8  2   lat: 113, long: 8 

Это то, что я пробовал, но результат у меня есть undefined

Примечание : beginDayID, endDayID являются переменными mongoose ObjectId представляет _id начала и конца дня.

mongoose.model('GPSData').aggregate([ 
    {$match: {_id:{$gte: beginDayID, $lt: endDayID}}}, 
    {$unwind: "$Coordinates"}, 
    {$project: {DeviceID: '$DeviceID' }}, 
    {$group: { DeviceID: '$DeviceID', $lat: '$Coordinates.lat', $long: '$Coordinates.long'}} 

    ], (e, data) => { 
    console.error(e) 
    console.log(data) 
    if (e) return callback(e, null); 
    return callback(null, data); 
    }) 
+0

См. Мой ответ - если это не сработает для вас, пожалуйста, покажите некоторые реальные образцы документов и ожидаемый результат, чтобы мы могли быть более конкретными. – DAXaholic

ответ

2

Я предполагаю, что у вас есть документы, несколько схожие с этим

/* 1 */ 
{ 
    "_id" : 1, 
    "DeviceID" : 1, 
    "Coordinate" : { 
     "lat" : 1, 
     "long" : 2 
    } 
} 

/* 2 */ 
{ 
    "_id" : 2, 
    "DeviceID" : 2, 
    "Coordinate" : { 
     "lat" : 1, 
     "long" : 6 
    } 
} 
... 

затем агрегация трубопровода, как это должно работать

mongoose.model('GPSData').aggregate([ 
    { 
     $match: ... // your match filter criteria 
    }, 
    { 
     $sort: { 
      _id: 1 
     } 
    }, 
    { 
     $group: { 
      _id: '$DeviceID', 
      lastId: { $last: '$_id' }, 
      lat: { $last: '$Coordinate.lat' }, 
      long: { $last:'$Coordinate.long' } 
     } 
    }, 
    { 
     $project: { 
      _id: '$lastId', 
      DeviceID: '$_id', 
      lat: 1, 
      long: 1 
     } 
    } 
]) 

форма внешний вид выходных документах, как это

/* 1 */ 
{ 
    "_id" : 1, 
    "DeviceID" : 1, 
    "Coordinate" : { 
     "lat" : 1, 
     "long" : 2 
    } 
} 

/* 2 */ 
{ 
    "_id" : 2, 
    "DeviceID" : 2, 
    "Coordinate" : { 
     "lat" : 1, 
     "long" : 6 
    } 
} 

Примечание e дополнительный этап $sort, так как вам нужно указать заказ, говоря о сохранении «последних значений». Возможно, вам придется указать другую сортировку, если у вас есть другие требования.

+0

работает должным образом, спасибо за ваш Помогите – XPLOT1ON

Смежные вопросы