Mongoose NodeJS Express-如何将数据推送到特定的子文档对象数组



提前感谢您的帮助。

我的问题本质上是将数据添加到特定的子文档中。

我的NodeJS服务器中有以下模型:

模型

const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const dataSchema = new Schema({
time: Date,
value: String
});
const nodeSchema = new Schema({
name: String,
description: String,
number: Number,
status: String,
lastSeen: Date,
data: [dataSchema]
});
const siteSchema = new Schema({
code: String,
name: String,
description: String,
totalNodes: Number,
nodes: [nodeSchema]
});
const Site = mongoose.model('site',siteSchema);
module.exports = Site;

基本上是这样的:

示例

{
"_id": "5fa169473a394829bc485069",
"code": "xfx3090",
"name": "Name of this site",
"description": "Some description",
"totalNodes": 2,
"__v": 0,
"nodes": [
{
"_id": "5fa1af361e085b516066d7e2",
"name": "device name",
"description": "device description",
"number": 1,
"status": "Offline",
"lastSeen": "2020-11-03T19:27:50.062Z",
"data": [
{
"Date": "2019-01-01T00:00:00.000Z",
"value": "12"
},
{
"Date": "2019-01-01T00:00:00.000Z",
"Value": "146"
}
]
},
{
"_id": "5fa1b10f4f24051520f85a58",
"name": "device name",
"description": "device description",
"number": 2,
"status": "Offline",
"lastSeen": "2020-11-03T19:35:43.409Z",
"data": [
{
"Date": "2019-01-01T00:00:00.000Z",
"Value": "555"
}
]
}
]
}
]

正如您所看到的,我已经用一些随机数据创建了两个虚拟节点。

我现在的问题是,假设我想向节点1添加一些数据。这个代码看起来怎么样?

我尝试了很多变化,尝试了很多不同的事情,但没有任何运气。我知道使用对象Id会更容易,但我希望有办法解决这个问题。

到目前为止,我的最佳结果是使用了这段代码,但不幸的是,它没有添加任何数据。

addNodeData: async (req,res,next) => {
const {siteCode} = xfx3090; //req.params
const { nodeNumber } = 1;  //req. params - just to show example
const nodeData = await Site.findOneAndUpdate({'code': siteCode, 'node.number': nodeNumber}, {$push: {'data':{'time': Date.now(), 'value':1223}}});
res.status(200).json({message:'success'});
}

提前谢谢!

您需要位置运算符$

你想要的查询是这样的:

db.collection.update({
"_id": "5fa169473a394829bc485069",
"nodes._id": "5fa1af361e085b516066d7e2"
},
{
"$push": {
"nodes.$.data": {
"Date": "newDate",
"value": "newValue"
}
}
})

第一部分是查找文档。我假设nodes._id不是唯一的,所以我也匹配_id

然后,使用文档中要添加新数据的指针,将$push使用到nodes.$.data中。因此,在文件data中将有一个新的对象。

这里是一个混杂的例子

最新更新