繁体   English   中英

更新嵌套数组 Mongoose

[英]Updating Nested Array Mongoose

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

//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)这是代码片段和解释如下:

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 成功地将值更新到测量数组,但是当我尝试向传感器数组添加多个测量时失败了。

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

{
"_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"
    }
  ]
  }]} 

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

在此处输入图片说明

正确的 JSON 格式是:

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

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

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

目前尚不清楚您在这里寻找什么,但也许最好是这样的:

{
"_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": []
}],
}

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

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

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

可以使用标识符和位置运算符$代替对数组的索引进行硬编码。

例子:

    User.findOneAndUpdate(
        {  _id: "Manasa" },
        { $push: { "sensors.$[outer].measurements": { "time": req.body.time } } }
        { "arrayFilters:" [{"outer._id": ObjectId("57da0a4bf3884d1fb2234c74")}]
    );

您可能会注意到,我没有通过提供ObjectId来指定我想要更新的传感器数组元素,而不是获取数组的第一个元素。

请注意, arrayFilters作为第三个参数作为选项传递给更新查询。

您现在可以通过像这样传递传感器的ObjectId来使"outer._id"动态化: {"outer._id": req.body.sensorId}

通常,通过使用identifier ,您可以通过遵循相同的过程并添加更多过滤器来获得更深的嵌套数组元素。

如果有第三级嵌套,您可以执行以下操作:

User.findOneAndUpdate(
    {  _id: "Manasa" },
    { $push: { "sensors.$[outer].measurements.$[inner].example": { "time": req.body.time } } }
    { "arrayFilters:" [{"outer._id": ObjectId("57da0a4bf3884d1fb2234c74"), {"inner._id": ObjectId("57da0a4bf3884d1fb2234c74"}}]
);

你可以找到更多的细节在这里由尼尔·伦恩书面答复。

参考 ::: positional-all

--- 条件 :: { other_conditions, 'array1.array2.field_to_be_checked': 'value' } --- updateData ::: { $push : { 'array1.$[].array2.$[].array3' : ' value_to_be_pushed' } }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM