3

我在这样的 mongo 集合中有一个 JSON 对象( Form )

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

我需要编辑字段(这是一个对象数组)。目前,我正在加载完整的表单并替换要更新的字段数据,然后用旧表单替换新表单。

为每个字段更新加载整个表单可能会影响性能,当加载大型表单时 有没有办法用fieldName (唯一)只更新字段详细信息而不是获取整个表单并进行编辑?

4

1 回答 1

2

更新:在回答这个问题之前,我错过了 ASP.NET 标记。我希望,这仍然可以让您找到解决方案

您可以使用带有arrayFilters的更新。这是一个测试它的游乐场链接。

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

基本上,您告诉 MongoDB,更新相应数组元素中的嵌套字段,以满足arrayFilters. 因此,在这种情况下,您将 path: 更新"Pages.$[pageItem].Field.$[fieldItem].Value"new value但仅在那些嵌套文档中,即:

  • 驻留在一个页面中,其名称为demo page
  • 并且,在该页面中,有一个文件,其名称是Gender
于 2021-09-24T23:19:31.990 回答