无法使用MQTT在Mongodb中插入数据

时间:2017-06-26 12:14:17

标签: node.js mongodb

我正在尝试将数据从MQTT代理保存到Mongodb。使用以下代码:

var mqtt = require('mqtt'); //includes mqtt server 
var mongodb = require('mongodb'); // includes mongoDB 
var mongodbClient = mongodb.MongoClient; //initialises the mongoDB client
var mongodbURI = 'mongodb://localhost:27017/WheelSenseHat'; 
var deviceRoot = "iot-lab/wheel/sensehat/"; 
var collection,client; 

mongodbClient.connect(mongodbURI, setupCollection);

function setupCollection(err, db) {
   if(err) 
throw err;
   collection=db.collection("WheelData"); 
   client=mqtt.connect({ host: 'iot.eclipse.org', port: 1883 }); 
   client.subscribe(deviceRoot+"+"); //subscribing to the topic name 
   client.on('message', insertEvent); //inserting the event

}

//function that displays the data in the MongoDataBase
function insertEvent(topic,message) {
   var key=topic.replace(deviceRoot,'');
   collection.update(
   { _id:key }, 
   { $push: { events: { event: {  value:message, when:new Date() } } } }, 
   { upsert:true },

   function(err,docs) {  
   if(err) {
      console.log("Insert fail")// Improve error handling       
     }
 }

 );

}

但是数据没有保存在MongoDB中。输出如下:

  

显示dbs   管理员0.000GB   本地0.000GB   使用WheelSenseHat   切换到db WheelSenseHat   展示收藏品

1 个答案:

答案 0 :(得分:1)

您的程序是否甚至收到了MQTT消息?尝试将console.log(topic + ":" + message)放入insertEvent()函数中,看看它是否被调用。您的订阅会转换为iot-lab/wheel/sensehat/+,它会匹配iot-lab/wheel/sensehat/data1之类的MQTT消息,但不会匹配iot-lab/wheel/sensehat/sensor/data ......“+”仅匹配一个“级别”,而“#”将匹配任何内容。如果传入的MQTT消息超过了'sensehat'的一个级别,那么您的程序将不会收到任何消息....因此,您的数据库中没有记录。