推送到 SubDoc 数组的 Mongo SubDoc

Posted

技术标签:

【中文标题】推送到 SubDoc 数组的 Mongo SubDoc【英文标题】:Pushing onto Mongo SubDoc of SubDoc array 【发布时间】: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,我不明白为什么会这样?

我哪里错了?

【问题讨论】:

【参考方案1】:

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

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

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

SensorNode.findOneAndUpdate(

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

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

【讨论】:

啊,美女!谢了哥们!我必须更改的另一件事是从 value 变量中删除 values 对象,只保留在两个字段中,并且效果很好。干杯

以上是关于推送到 SubDoc 数组的 Mongo SubDoc的主要内容,如果未能解决你的问题,请参考以下文章