【问题标题】:Pushing onto Mongo SubDoc of SubDoc array推送到 SubDoc 数组的 Mongo SubDoc
【发布时间】:2018-04-29 00:59:54
【问题描述】:

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

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

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]
});

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

我查看了一些关于类似问题的其他示例和问题,并查看了使用填充,但似乎无法让它们工作。

这是我的代码:

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

Values 绝对是传感器架构中的一个数组。

为了 UI 的缘故,我使用的是可读 ID,而不是自动分配的 Mongo DB ID,但如果这有什么不同,我可以使用 MongoDB _id,我不明白为什么会这样?

我哪里错了?

【问题讨论】:

    标签: arrays node.js mongodb mongoose schema


    【解决方案1】:

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

    位置 $ 运算符标识数组中要更新的元素,而无需明确指定该元素在数组中的位置。要从读取操作投影或返回数组元素,请参阅 $ 投影运算符。

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

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

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

    【讨论】:

    • 啊,美女!谢了哥们!我必须更改的另一件事是从 value 变量中删除 values 对象,只保留在两个字段中,并且效果很好。干杯
    猜你喜欢
    • 2020-08-10
    • 1970-01-01
    • 2021-09-17
    • 2017-01-23
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 2016-08-05
    相关资源
    最近更新 更多