推进SubDoc数组

时间:2017-11-15 17:17:27

标签: arrays node.js mongodb mongoose schema

我正在与这个人围成一圈,希望有人可以提供帮助。我正在构建一个从节点接收传感器值的nodejs应用程序。节点上可以有多个传感器。

使用NodeJS,Mongod DB和Mongoose,都在树莓派上运行,3我已经构建了以下Schemas&型号:

var mongoose = require('mongoose');

var Schema = mongoose.Schema;

var valueSchema = new Schema ({
  timestamp: {type: Date},
  value: {}
});

var sensorSchema = new Schema ({
  id: {type: Number},
  type: {type: String},
  description: {type: String},
  ack: {type: Boolean},
  values: [valueSchema]
});

var SensorNode = mongoose.model('SensorNode', {
  id: {type: Number, required: true},
  protocol: {},
  sensors: [sensorSchema]
});

我可以添加节点,并将传感器推到传感器阵列上,但我似乎无法将值推到值数组上。

我已经查看了其他几个关于类似问题的示例和问题,并查看了使用populate,但似乎无法让它们工作。

这是我的代码:

function saveValue(rsender, rsensor, payload) {

  var value = {
    values: {
      timestamp: new Date().getTime(),
      value: payload
    }
  }

  SensorNode.findOneAndUpdate({

    "id": rsender,
    "sensors.id": rsensor
  }, {
    "$push": {
      "sensors.$": value
    }
  }, function(err, result) {

    if (err) { 
      console.log(err);
    }
    console.log(result);
  });

}

这是返回未定义的结果和此错误:

MongoError: exception: Cannot apply $push/$pushAll modifier to non-array

值绝对是传感器架构中的数组。

我使用可读的ID而不是自动分配的Mongo数据库ID为了UI,但我可以使用MongoDB _id,如果这有任何区别,我不明白为什么会这样?

我哪里错了?

1 个答案:

答案 0 :(得分:0)

您正在使用位置运算符$所以让我们检查docs

  

位置$运算符标识要更新的数组中的元素,而不显式指定数组中元素的位置。要从读取操作中投影或返回数组元素,请参阅$ projection运算符。

所以传感器。$将返回传感器阵列中的一个特定文档。这就是您收到错误的原因。在此级别的文档中,您只能使用$ set替换此项目。我打赌你想做这样的事情:

SensorNode.findOneAndUpdate({

    "id": rsender,
    "sensors.id": rsensor
  }, {
    "$push": {
      "sensors.$.values": payload
    }
  });

此操作只会将有效负载附加到id等于rsensor的一个特定传感器中的值数组。