更新嵌套数组 Mongoose [英] Updating Nested Array Mongoose

查看:19
本文介绍了更新嵌套数组 Mongoose的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个需要更新嵌套数组的 express js 应用程序.1)架构:

I am working on an express js application where I need to update a nested array. 1) Schema :

//Creating a mongoose schema
var userSchema = mongoose.Schema({
_id: {type: String, required:true},
name: String,
sensors: [{
    sensor_name: {type: String, required:true},
    measurements: [{time: String}]
}] });

2)这是代码片段和解释如下:

2) Here is the code snippet and explanation is below:

router.route('/sensors_update/:_id/:sensor_name/')
.post(function (req, res) {
User.findOneAndUpdate({_id:req.body._id}, {$push: {"sensors" : 
{"sensor_name" : req.body.sensor_name , "measurements.0.time": req.body.time } } },
{new:true},function(err, newSensor) {
if (err)
res.send(err);
res.send(newSensor)
}); });

我能够使用 findOneAndUpdate 和推送技术成功更新测量数组的值,但是当我尝试向传感器数组添加多个测量时失败.

I am able to successfully update a value to the measurements array using the findOneAndUpdate with push technique but I'm failing when I try to add multiple measurements to the sensors array.

这是当我向传感器阵列发布第二次测量时得到的当前 json:

Here is current json I get if I get when I post a second measurement to the sensors array :

{
"_id": "Manasa",
"name": "Manasa Sub",
"__v": 0,
"sensors": [
{
  "sensor_name": "ras",
  "_id": "57da0a4bf3884d1fb2234c74",
  "measurements": [
    {
      "time": "8:00"
    }
  ]
},
{
  "sensor_name": "ras",
  "_id": "57da0a68f3884d1fb2234c75",
  "measurements": [
    {
      "time": "9:00"
    }
  ]
  }]} 

但我想要的正确格式是使用传感器阵列发布多个测量值,如下所示:

But the right format I want is posting multiple measurements with the sensors array like this :

正确的 JSON 格式是:

Right JSON format would be :

 {
"_id" : "Manasa",
"name" : "Manasa Sub",
"sensors" : [ 
    {
        "sensor_name" : "ras",
        "_id" : ObjectId("57da0a4bf3884d1fb2234c74"),
        "measurements" : [ 
            {
                "time" : "8:00"
            }
        ],
        "measurements" : [ 
            {
                "time" : "9:00"
            }
        ]
    }],
"__v" : 0 }

请就此提出一些想法.提前致谢.

Please suggest some ideas regarding this. Thanks in advance.

推荐答案

您可能想要重新考虑您的数据模型.就目前而言,你无法完成你想要的.传感器字段是指一个数组.在您提供的理想文档格式中,该数组中有一个对象.然后在该对象内部,您有两个具有完全相同键的字段.在 JSON 对象或此上下文中的 mongo 文档中,同一对象中不能有重复的键.

You might want to rethink your data model. As it is currently, you cannot accomplish what you want. The sensors field refers to an array. In the ideal document format that you have provided, you have a single object inside that array. Then inside that object, you have two fields with the exact same key. In a JSON object, or mongo document in this context, you can't have duplicate keys within the same object.

目前还不清楚您要在这里寻找什么,但也许最好这样做:

It's not clear exactly what you're looking for here, but perhaps it would be best to go for something like this:

{
"_id" : "Manasa",
"name" : "Manasa Sub",
"sensors" : [ 
    {
    "sensor_name" : "ras",
    "_id" : ObjectId("57da0a4bf3884d1fb2234c74"),
    "measurements" : [ 
        {
            "time" : "8:00"
        },
        {
            "time" : "9:00"
        }
    ]
},
{
    // next sensor in the sensors array with similar format
    "_id": "",
    "name": "",
    "measurements": []
}],
}

如果这是你想要的,那么你可以试试这个:

If this is what you want, then you can try this:

User.findOneAndUpdate(
    {  _id:req.body._id "sensors.sensor_name": req.body.sensor_name },
    { $push: { "sensors.0.measurements": { "time": req.body.time } } }
);

作为旁注,如果您只想在测量数组中的每个对象中存储单个字符串,您可能只想存储实际值而不是整个对象 { time: "价值"}.您可能会发现通过这种方式处理数据更容易.

And as a side note, if you're only ever going to store a single string in each object in the measurements array, you might want to just store the actual values instead of the whole object { time: "value" }. You might find the data easier to handle this way.

这篇关于更新嵌套数组 Mongoose的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆