推送到 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的主要内容,如果未能解决你的问题,请参考以下文章

通过 mongoose 将项目推送到 mongo 数组中

通过 mongoose 将项目推送到 mongo 数组中

通过 mongoose 将项目推送到 mongo 数组中

通过 mongoose 将项目推送到 mongo 数组中

通过 mongoose 将项目推送到 mongo 数组中

通过 mongoose 将项目推送到 mongo 数组中