删除嵌套唯一键MongoDB上不需要的键

mxg2im7a  于 2023-02-15  发布在  Go
关注(0)|答案(1)|浏览(99)

我有这样的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,
    },
  },
}

我的系统上有MapID的列表,应该如下所示

ids = [123]

我想从文档中删除不在列表(id)中的密钥,从特定日期(today/“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

wljmcqd8

wljmcqd81#

按照评论中的讨论,如果重构模式是一个选项,那么您可以通过非常简单的查询来实现您所需要的。

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.避免使用动态值作为字段名
1.将日期格式化为正确的日期对象
1.避免高度嵌套的数组/对象

相关问题