2016-07-03 2 views
0

Итак, у меня есть этот набор данных в коллекции монго, и мне нужна температура и время, которое нужно вернуть в отдельном массиве для устройства, которое я прошу.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")] 
}, { 
    ... 
}] 
*/ 
+0

Определенно отправить его в правильном направлении, но я получаю сообщение об ошибке «неожиданный» идентификатор для т и д? – Lucky7Chess

+0

ОК, так что я вытаскиваю волосы из лола. Как получить данные массива для определенного устройства/идентификатора? – Lucky7Chess

+0

'arr.find (x => x._id === 'foo')', где 'arr' выглядит как' [{_id: 'foo'}] '. Когда я пытаюсь создать агрегаты, я использую robomongo, чтобы попробовать их и посмотреть, как выглядит структура данных. Ключ регистрирует все, что вам нужно, чтобы знать значение/структуру –

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