简体   繁体   中英

How to update array inside MongoDB document

Can someone help me with a solution to update an array object inside the MongoDB document, I've tried a couple of methods but still it's to updating, here is my document that I want to update the array in the document.

{
"title": "Products",
"description": "test",
"image": "bdd8510d75f6e83ad308d5f306afccef_image.jpg",
"_created_at": "2021-06-07T20:51:08.316Z",
"ratingCount": 0,
"ratingTotal": 0,
"placeListSave": [
    {
        "objectId": "g70brr45pfi",
        "name": "Kale",
        "email": "null",
        "strBrandLogo": "84de8865e3223d1ca61386355895aa04_image.jpg",
        "storeNumber": "56",
        "phone": "0815342119",
        "createdAt": "2021-06-10T10:19:53.384Z",
        "image": "ad1fb7602c2188223fd891a52373cb9d_image.jpg"
    },
    {
        "objectId": "0qokn33p773",
        "name": "Apple",
        "email": null,
        "strBrandLogo": null,
        "storeNumber": "01",
        "phone": "011 393 8600",
        "createdAt": "2021-06-11T03:11:17.342Z",
        "image": "8cfcbf2bcb5e3b4ea8ade44d3825bb52_image.jpg"
    }
]

}

So I only want to update the apple object and change the data, I've tried the following code but doesn't seem to work.

`

  var db = client.db("test");

  try {
    db.collection("ShoppingCentres").updateOne({
      "title": req.body.product,
      "placeListSave.objectId": req.body.id,

    }, {
      $set: {
    
        "placeListSave.$.email": req.body.email,
        "placeListSave.$.storeNumber": req.body.storeNumber,
        "placeListSave.$.phone": req.body.phone,
        "placeListSave.name": req.body.name,
      },
    });

    res.json("client");
  } catch (e) {
    console.log("verify", e);
  }
});`

arrayFilters seems suitable here:

 db.collection.update({
  "title": "Products",
  "placeListSave.objectId": "0qokn33p773",
 },
 {
   $set: {
     "placeListSave.$[x].email": "test@some.email",
     "placeListSave.$[x].storeNumber": "test",
     "placeListSave.$[x].phone": "test",
     "placeListSave.$[x].name": "test"
  }
 },
 {
  arrayFilters: [
     {
     "x.objectId": "0qokn33p773"
      }
  ]
  })

explained: Add array filter called "x" with the objectId for the element that you need to update and use this filter in the $set stage to update the necessary elements.

Hint: To speed up the update you will need to add index on title field or compound index on title+placeListSave.objectId

playground

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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