【问题标题】:Mongoose NodeJS Express - How to Push Data To a Specific Sub Document Object ArrayMongoose NodeJS Express - 如何将数据推送到特定的子文档对象数组
【发布时间】:2021-02-16 13:02:00
【问题描述】:

提前感谢您的帮助。

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

我的 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'});
    }

提前谢谢你!

【问题讨论】:

    标签: node.js json mongodb express mongoose


    【解决方案1】:

    您需要位置运算符$

    你想要的查询是这样的:

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

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

    然后,使用要添加新数据的文档中的指针,使用$push 进入nodes.$.data。所以,data 文件中会有一个新对象。

    一个 mongo plauground 示例是 here

    【讨论】:

    • 不错的解决方案。我会添加原型update(<filter>, <update>, <options>)。看起来该网站的名称也可能是一个很好的过滤器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 2021-02-16
    相关资源
    最近更新 更多