繁体   English   中英

如何更新 mongodb 中数组中元素的 object?

[英]how to update an object of an element in array in mongodb?

这是我的结构,如果 object 键匹配,我想更新嵌套数组元素 - 我想匹配 grnno:"10431000" 并更新该 object 的其他键,例如 vehicle_no、invoice_no 等。

{
    "_id" : ObjectId("5f128b8aeb27bb63057e3887"),
    "requirements" : [ 
        {
            "grns" : [ 
                {
                    "invoice_no" : "123",
                    "vehicle_no" : "345",
                    "req_id" : "5f128c6deb27bb63057e388a",
                    "grnno" : "10431000"
        },
        {
                    "invoice_no" : "abc",
                    "vehicle_no" : "def",
                    "req_id" : "5f128c6deb27bb63057e388a",
                    "grnno" : "10431001"
        }
          ]
       }
    ]
}

我试过这段代码

 db.po_grn.update({
                "requirements.grns.grnno":"10431001"
            }, {
                $set: {
                    "requirements.$.grns": {"invoice_no":"test",vehicle_no:"5455"}
                }
            })

但这正在改变我这样的结构

 "requirements" : [ 
        {
            "grns" : {
                "invoice_no" : "test",
                 "vehicle_no":"5455"

            },
            "req_id" : ObjectId("5f128b8aeb27bb63057e3886")
        }
    ],

grns 键应该是数组,更新应该是与键“grnno”匹配的特定 object。 请帮帮我。 谢谢。

==编辑==

var grnno = req.body.grnno;
db.po_grn.find({
    "requirements.grns.grnno":grnno
}).toArray(function(err, po_grn) {
    console.log("po_grn",po_grn);
    if (po_grn.length > 0) {
        console.log("data.grn.grnno ", grnno);
        var query = {
             requirements: {
                $elemMatch: {
                    "grns.grnno": grnno
                }
             }
        };

        var update = {
            $set: {
                'requirements.$[].grns.$[inner].invoice_no': data.invoice_no,
                'requirements.$[].grns.$[inner].vehicle_no': data.vehicle_no,
            }
        };

        var options = {
            arrayFilters: [
                { "inner.grnno" : grnno }
            ] 
        };

        db.po_grn.update(query, update, options
        , function(er, grn) {
            console.log("grn",grn,"er",er)
                        res.send({
                            status: 1,
                            message: "Grn updated successfully"
                        });
                    }
            );
    } else {
            res.send({
                status: 0,
                message: "Grn not found "
            });
    }
})

使用$[] positional-all 运算符与array filters的组合来更新您的内部嵌套文档。

var query = {
     requirements: {
        $elemMatch: {
            "grns.grnno": "10431001"
        }
     }
};

var update = {
    $set: {
        'requirements.$[].grns.$[inner].invoice_no': "test",
        'requirements.$[].grns.$[inner].vehicle_no': "5455",
    }
};

var options = {
    arrayFilters: [
        { "inner.grnno" : "10431001" }
    ] 
};

db.collection.update(query, update, options);

更新 -

附上NodeJS本机MongoDb驱动代码,工作正常

在此处输入图像描述

const { MongoClient } = require('mongodb');
const url = "mongodb://localhost:27017/";

MongoClient.connect(url, function(err, db) {
  if (err) {
    throw err;
  }

  const dbo = db.db("test");
  (async() => {
    const query = {
        requirements: {
           $elemMatch: {
               "grns.grnno": "10431001"
           }
        }
    };
   
   const update = {
       $set: {
           'requirements.$[].grns.$[inner].invoice_no': "test",
           'requirements.$[].grns.$[inner].vehicle_no': "5455",
       }
    };
   
   const options = {
       arrayFilters: [
           { "inner.grnno" : "10431001" }
       ],
       multi: true
   };

    try {
      const updateResult = await dbo.collection("collection").update(query, update, options);
    } catch (err) {
      console.error(err);
    }
    db.close();
  })(); 
});

暂无
暂无

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

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