MongoDB (Node.js) возвращает данные в массив

Таким образом, у меня есть этот набор данных в коллекции Монго, и мне нужно, чтобы температура и время были возвращены в отдельный массив для устройства, которое я запрашиваю.

device01t: [32.00, 42.00] device01d: [дата, дата] или device02t [22.00, 43.00] и т. д.

{
    "_id" : "device01",
    "event" : [
            {
                    "temperature" : "32.00",
                    "when" : ISODate("2016-07-02T00:21:41.441Z")
            },
            {
                    "temperature" : "42.00",
                    "when" : ISODate("2016-07-02T00:21:46.766Z")
            },             
    ]
}
 {
    "_id" : "device02",
    "event" : [
            {
                    "temperature" : "22.00",
                    "when" : ISODate("2016-06-02T00:21:41.441Z")
            },
            {
                    "temperature" : "43.00",
                    "when" : ISODate("2016-07-02T00:21:46.766Z")
            },             
    ]
}

Я использую mqtt(не имеет отношения к вопросу), но я отправляю данные в коллекцию, используя

collection.update(  
  { _id:key },  //key extracted from device topic
  { $push:  { event: { value:String(payload), when:new Date() } }  },
  { upsert:true },

Я попытался использовать код Node.js (драйвер MongoDB по умолчанию), чтобы извлечь значения температуры устройства:

var resultArray = [];
    mongo.connect(url, function(err, db) {
    var cursor = db.collection('test_mqtt').find({"_id":"device01"},{"event.value":1,"_id":0});
         cursor.forEach(function(doc, err) {
         resultArray.push(doc.event);
}, function() {
  db.close();
  console.log(resultArray);
});

но это не возвращает массив с каждым значением в своем собственном слоте, как я и предполагал. Следует ли изменить схему или я что-то упустил из-за того, как работает Mongo find()?

1 ответ

Решение

С .aggregate у нас есть $unwind а также $group что может быть полезно здесь

db.collection('test_mqtt').aggregate([
    {$unwind: '$event'},
    {$group: {
        _id: '$_id',
        t: {$push: '$event.temperature'}
        d: {$push: '$event.when'}
    }}
]);
/*
[{
    _id: "device01",
    t: ["32.00", "42.00"],
    d: [ISODate("2016-07-02T00:21:41.441Z"), ISODate("2016-07-02T00:21:46.766Z")]
}, {
   ...
}]
*/
Другие вопросы по тегам