【问题标题】:Remove unwanted key on nested unique keys MongoDB删除嵌套唯一键上不需要的键 MongoDB
【发布时间】:2023-02-13 23:54:57
【问题描述】:

我有这种 mongodb 文档示例

"data": {
  "2023-02-01": {
    "123": {
      "price": 100,
    },
    "234": {
      "price": 100,
    },
  },
  "2023-02-02": {
    "123": {
      "price": 100,
    },
    "234": {
      "price": 100,
    },
  },
  "2023-02-03": {
    "123": {
      "price": 100,
    },
    "234": {
      "price": 100,
    },
  },
}

我的系统上有映射 ID 列表,应该是这样的

ids = [123]

我想从文档中删除不在列表(ids)中的键,从特定日期(今天/“2023-02-02”)开始,日期总是更新,所以 ID,我的预期结果是

"data": {
  "2023-02-01": {
    "123": {
      "price": 100,
    },
    "234": {
      "price": 100,
    },
  },
  "2023-02-02": {
    "123": {
      "price": 100,
    },
  },
  "2023-02-03": {
    "123": {
      "price": 100,
    },
  },
}

我可以在 MongoDB 聚合上实现吗?我正在使用 pymongo

【问题讨论】:

  • 使用动态值作为字段名被认为是反模式,并给查询带来不必要的复杂性。除非你有非常吸引人的理由,否则你应该避免高度嵌套。您应该考虑像 this 这样的模式
  • 是的,我认为最好使用那种模式,感谢您的建议。如果我有一个包含该架构的文档,您是否有其他想法来实现我的目标?

标签: mongodb pymongo


【解决方案1】:

根据 cmets 中的讨论,如果重构模式是一个选项,您可以在非常简单的查询中实现您需要的。

db.collection.update({
  "date": {
    $gte: ISODate("2023-02-02")
  }
},
[
  {
    $set: {
      value: {
        $filter: {
          input: "$value",
          as: "v",
          cond: {
            $in: [
              "$$v.key",
              [
                "123"
              ]
            ]
          }
        }
      }
    }
  }
],
{
  multi: true
})

Mongo Playground


我提议的架构:

[
  {
    "date": ISODate("2023-02-01"),
    "value": [
      {
        "key": "123",
        "price": 100
      },
      {
        "key": "234",
        "price": 100
      }
    ]
  },
  {
    "date": ISODate("2023-02-02"),
    "value": [
      {
        "key": "123",
        "price": 100
      },
      {
        "key": "234",
        "price": 100
      }
    ]
  },
  {
    "date": ISODate("2023-02-03"),
    "value": [
      {
        "key": "123",
        "price": 100
      },
      {
        "key": "234",
        "price": 100
      }
    ]
  }
]

你可以看到有几件事:

  1. 避免使用动态值作为字段名称
  2. 将日期格式化为正确的日期对象
  3. 避免高度嵌套的数组/对象

【讨论】:

    猜你喜欢
    • 2017-09-27
    • 2017-05-03
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 2021-09-01
    • 2014-10-26
    • 1970-01-01
    相关资源
    最近更新 更多