【问题标题】:MongoDB - How to remove part of field with $unsetMongoDB - 如何使用 $unset 删除部分字段
【发布时间】:2022-01-27 21:38:31
【问题描述】:

我在 MongoDB 中有一个数据库,其中有以下结构的条目image

我正在使用 Python 中的脚本从该结构中检索信息,然后将其保存到 csv。

最终目标是仅删除parameters 结构的某些部分。例如,我想保留 parameters[0].valuesparameters[1].values 而不是 parameters[2:5].values

我没有这方面的经验,但我使用的命令如下

{"$unset":"exercises.parameters.values"] }

但这将从parameters 内的所有对象中删除所有values。由于变量在对象中具有相同的名称,我无法找到指定我想要的对象的方法。

我也尝试过这样的索引

{"$unset":"exercises.parameters[2].values"] }

但这似乎不起作用......

非常感谢您的帮助!

【问题讨论】:

    标签: arrays mongodb unset


    【解决方案1】:

    更新

    db.collection.update({
      "_id": 1
    },
    {
      "$unset": {
        "exercises.$[].parameters.2.values": "",
        "exercises.$[].parameters.3.values": "",
        "exercises.$[].parameters.4.values": "",
        "exercises.$[].parameters.5.values": ""
      }
    },
    {
      "multi": true
    })
    

    mongoplayground


    聚合

    db.collection.aggregate([
      {
        $set: {
          "exercises": {
            "$map": {
              "input": "$exercises",
              "as": "item",
              "in": {
                "$mergeObjects": [
                  "$$item",
                  {
                    parameters: {
                      $slice: [ "$$item.parameters", 2 ]
                    }
                  }
                ]
              }
            }
          }
        }
      }
    ])
    

    mongoplayground

    【讨论】:

    • 感谢您的回复!我不知道真正有用的 mongo 游乐场。我可以看到您的示例有效,但它使用的是update,但是我使用的是aggregate,因为我不想更改数据库,只是从中获取数据。我尝试将代码更改为使用aggregate,但我总是收到错误“由:: FieldPath 字段名称导致的无效$unset :: 可能不以'$'开头。考虑使用$getField 或$setField。”关于如何解决这个问题的任何想法?
    • @GonçaloChambel 我用$aggregate更新我的答案
    • 非常感谢它的工作!
    猜你喜欢
    • 2017-02-12
    • 2022-12-01
    • 2021-12-02
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 2019-02-13
    • 2019-05-18
    相关资源
    最近更新 更多