你好,我需要一种方法来更新文档在mongodb 4.4,当我现在不确切的关键路径.

在这个例子中,我不知道dict键, 但我知道在未知的dict密钥下有一个字段"name"值为"test1".

我想要的是更新例如dict与名称"test1". 点符号似乎不是一个选项, example.key1.name,因为"key1"是未知的.

{
    "example": {
        "key1": {
            "name": "test1"
        },
        "key2": {
            "name": "test2"
        }
    }
}

您的问题已被确定为另一个问题的重复 问题如果答案没有解决您的问题,请 编辑以详细解释问题中独特的部分. MongoDB wildcard in the key of a query

我要求更新不是为了找到.

推荐答案

我不知道是否有更好的 Select 性能,但你可以try 使用aggregation update

这个 idea 是把你的dict转换成一个数组,映射这个数组并找到你想要的值来更新,然后再次恢复dict.

您可以使用这个查询,其中使用$objectToArray,您将键作为k值,值作为v.判断this example以了解该步骤的数据如何.

所以你不能忘记键值,你不知道key1,但没关系,因为你可以在v.name等于test1中找到你想要的对象.

所以你可以用$eq得到这个值.所以"$$this.v.name"应该是test1.并使用$mergeObjects替换(如果有必要,可以在v中添加更多的键).

然后反过来,你有一个基于kv的数组,所以使用$arrayToObject,你可以重建原始的dict,但更新.

db.collection.update({},
[
  {
    "$set": {
      "example": {
        "$arrayToObject": {
          "$map": {
            "input": {
              "$objectToArray": "$example"
            },
            "in": {
              "$cond": [
                {
                  "$eq": [
                    "$$this.v.name",
                    "your_goal_value"
                  ]
                },
                {
                  "$mergeObjects": [
                    "$$this",
                    {
                      "v": {
                        "name": "your new value to update"
                      }
                    }
                  ]
                },
                "$$this"
              ]
            }
          }
        }
      }
    }
  }
])

示例here

Mongodb相关问答推荐

在MongoDB中使用explain()和查询时缺少winningPlan''''

MongoDB聚合:将文档列表转换为列表

字段$set聚合导致错误美元($)前缀字段$concatArrays对于存储无效"

Select 筛选聚合中的嵌套字段

找到一个用户,然后使用 MongoDB 根据他们的总分获得他们的排名

MongoDB 存储大量指标/分析数据的方法

增加嵌套对象中的值?

是否可以迭代 mongo 游标两次?

无法提取地理键,经度/纬度超出范围

ExpressJS & Mongoose REST API struct :最佳实践?

在 mongodb 中查找字段的所有非不同值

C# mongodb driver 2.0 - 如何在批量操作中更新插入?

如何确保基于特定字段的数组中的唯一项 - mongoDB?

文本的 MongoID 数据类型

Mongoose / MongoDB 用户通知方案建议

Mongo: query by key one level deep

MongoDB备份计划

处理Mongodb连接的正确方法是什么?

mongo中的稀疏索引和空值

如何通过键名从 mongoDB 中检索值?