Search code examples
asp.netmongodbasp.net-coreentity-framework-corenested-json

How to update nested JSON object fields in mongo Db collection using ASP.NET Core


I have a JSON object(Form) in the mongo collection like this

{
    "_id": "87124eb6-c9f7-49b9-8470-8c2b7fb07dc8",
    "VisitName": "demo visit",
    "Version": "string",
    "FormStatus": "string",
    "FormName": "demo form",
    "IsDeleted": false,
    "Pages": [
        {
            "PageName": "demo page",
            "PageNo": 1,
            "PageStatus": true,
            "Field": [
                {
                    "FieldName": "Gender",
                    "Value": "demo value",
                    "Comment": "demo comment",
                }
            ]
        }
    ]
}

I need to edit the Field (which is an array of objects ). Currently, I am loading the full form and replacing the field data to be updated, Then replace the new form with the old one.

loading the whole form for each field update may affect performance, when loading large forms Is there any way to update only the field details with fieldName(Unique) Instead of fetching the whole Form and editing?


Solution

  • Update: I missed the ASP.NET tag before answering this. I hope, this still gets you to the solution

    You can use an update with arrayFilters. Here's a playground link to test it.

    db.collection.update({
      "FormName": "demo form"
    },
    {
      $set: {
        "Pages.$[pageItem].Field.$[fieldItem].Value": "new value"
      }
    },
    {
      arrayFilters: [
        {
          "pageItem.PageName": "demo page"
        },
        {
          "fieldItem.FieldName": "Gender"
        }
      ]
    })
    

    Basically, you tell MongoDB, update the nested field in the corresponding array element, that fulfils the filter specified by arrayFilters. So in this case, you update the path: "Pages.$[pageItem].Field.$[fieldItem].Value" to the new value but only in those nested documents, that:

    • reside in a page, whose name is demo page
    • and, in that page, there is a filed, whose name is Gender