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