【问题标题】:In MongoDB, how to Update an Array in an Object in a Document在 MongoDB 中,如何更新文档中对象中的数组
【发布时间】:2021-08-08 05:13:21
【问题描述】:

我的文档在 MongoDB 中如下所示:

  {
    "_id": {
        "$oid": "6099d057b769cc513025fd54"
    },
    "key_name": "I_CAN_MATCH",
    "object_1": {
        "sub_object_array_1": [{
            "a": "TZNNI",
            "b": "R"
        }],
        "sub_object_array_2": [{
            "c": "SDLYA",
            "d": "N"
        }, {
            "c": "KTSMQ",
            "d": "N"
        }],
        "sub_object_array_3": [{
            "e": "KYCT0",
            "f": "F"
        }, {
            "e": "KYCT1",
            "f": "N"
        }, {
            "e": "KYCT2",
            "f": "F"
        }, {
            "e": "KYCT3",
            "f": "E"
        }],
    },
    "object_2": {
      "sub_object_4": { "and": "so on ..." }
    },
    "object_array_1": [{
            "g": "KYCT0",
            "h": "F"
        }, {
            "g": "KYCT1",
            "h": "N"
        }, {
            "g": "KYCT2",
            "h": "F"
        }, {
            "g": "KYCT3",
            "h": "E"
        }]
  }

我的问题是如何更新数组 sub_object_array_3 where f = "F" to f = "U"?

以下内容对我不起作用:

  await db_model.updateMany( 
    { key_name: "I_CAN_MATCH" },
    { $set: { "object_1.sub_object_array_3.$[array_element].f": "U" } },
    { arrayFilters: [ { "array_element.f": "F" } ] } );

但以下内容可以!所以我理解语法在这种情况下是如何工作的。

  await db_model.updateMany( 
    { key_name: "I_CAN_MATCH" },
    { $set: { "object_array_1.$[array_element].h": "U" } },
    { arrayFilters: [ { "array_element.h": "F" } ] } );

我只是不知道当数组首先位于对象内部时,我在 $set 命令中缺少什么。

我已经搜索过了,但是我使用的每个搜索词都将我指向数组中的数组,这里不是这种情况。 有人可以帮助我吗?

提前致谢!

【问题讨论】:

  • 请删除不相关的字段。
  • 我不确定我明白你的意思。

标签: arrays mongodb object nested mongodb-query


【解决方案1】:

错误 - https://mongoplayground.net/p/Cvfc6oNyhrH

fail to run update: multiple write errors: [{write errors: [{Error parsing array filter :: caused by :: The top-level field name must be an alphanumeric string beginning with a lowercase letter, found 'array_element'}]}, {<nil>}]

解决方案:-

将array_element 更改为arrayElement 或不带_ 的任何内容

注意:- 应该是alphanumeric

https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/

必须以小写字母开头,并且只能包含字母数字字符。


演示 - https://mongoplayground.net/p/GJku1bFaj3m

db.collection.update({
  key_name: "I_CAN_MATCH"
},
{
  $set: {
    "object_1.sub_object_array_3.$[arrayElement].f": "U"
  }
},
{
  arrayFilters: [
    { "arrayElement.f": "F" }
  ]
})

【讨论】:

  • 好吧,如果您在我上面的文档中注意到,SUB_OBJECT_ARRAY_3 或其他任何一个,没有带有“_ID”的元素。那是踢球者! arrayFilters 语句似乎仅适用于 CoreMongooseArrays。一旦我合并了“_ID”(通过键入它),您所拥有的,或者我所拥有的,工作!所以我们都很好。谢谢!
猜你喜欢
  • 2021-12-29
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 2020-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多