【问题标题】:Mongoose findOneAndUpdate inside nested Arrays嵌套数组中的猫鼬 findOneAndUpdate
【发布时间】:2017-01-03 20:51:16
【问题描述】:

如果 componentId 和 wfInstanceId id 匹配,我需要更新“字段”数组中的类型、键和值。

这是我需要这样做的文件。

{
    "_id": {
        "$oid": "586b6d756937c22f207dd5af"
    },
    "wfInstanceId": "0111",
    "workflowId": "ash3",
    "folderURL": "ash3",
    "teamName": "teamName",
    "dataStream": [
        {
            "componentInstanceId": "componentInstanceId1",
            "componentId": "componentId1",
            "_id": {
                "$oid": "586b6d756937c22f207dd5b0"
            },
            "fields": [
                {
                    "type": "String",
                    "value": "value1",
                    "key": "key",
                    "_id": {
                        "$oid": "586b6d756937c22f207dd5b1"
                    }
                },
                {
                    "type": "String",
                    "value": "value2",
                    "key": "key1",
                    "_id": {
                        "$oid": "586b6d756937c22f207dd5b1"
                    }
                }
            ]
        },
        {
            "componentInstanceId": "componentInstanceId2",
            "componentId": "componentId22",
            "_id": {
                "$oid": "586b6d756937c22f207dd5b0"
            },
            "fields": [
                {
                    "type": "String",
                    "value": "value1",
                    "key": "key",
                    "_id": {
                        "$oid": "586b6d756937c22f207dd5b1"
                    }
                },
                {
                    "type": "String",
                    "value": "value2",
                    "key": "key2",
                    "_id": {
                        "$oid": "586b6d756937c22f207dd5b1"
                    }
                }
            ]
        }
    ],
    "id": "38f356f0-d196-11e6-b0b9-3956ed7f36f0",
    "__v": 0
}

我这样尝试过,我也尝试过 $set 而不是 $push,这也是行不通的。

Model.findOneAndUpdate( {'wfInstanceId': '0111', 'dataStream.componentId': 'componentId1'}, {$push : { 'dataStream.fields.$.key' : 'sdsdds' }}, { upsert: true }, function (err, data) {
                if (err) {
                    reject(err);
                    console.log('error occured' + err);
                }
                console.info("succesfully saved");
                resolve (data);
            });

正如他们在DOC 中描述的那样,它应该适用于对我也不起作用的更新方法。任何帮助将不胜感激,以克服我面临的这个问题。

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    当您使用 $ 运算符时,它只会更新每个文档中的 first 匹配的数组元素。

    到目前为止,mongoose 无法直接更新所有数组元素。

    你可以这样做:

    db.collection.find({'wfInstanceId': '0111', 'dataStream.componentId': 'componentId1'})
      .forEach(function (doc) {
        doc.datastream.forEach(function (datastream) {
          if (dataStream.componentId === componentId1) {
            dataStream.fields.forEach(function(fields){
             // you can also write condition for matching condition in field
               dataStream.fields.key="";
               dataStream.fields.value="";
               dataStream.fields.type="";
             }
          }
        });
        db.collection.save(doc);
      }); 
    

    这是正常的javascript代码。我认为这对 mongo 新手来说更清楚。

    【讨论】:

    • 它说 Model.save 不是一个函数
    • 在猫鼬中做这个 doc.save();因为保存方法在文档中
    • 有人知道如何使用 $push 或 $set 吗?
    猜你喜欢
    • 1970-01-01
    • 2018-10-30
    • 2013-11-24
    • 1970-01-01
    • 2019-05-23
    • 2015-11-24
    • 2021-09-25
    • 2017-10-05
    • 1970-01-01
    相关资源
    最近更新 更多