如何从 MongoDB collection 中删除 sub-document 中不匹配的值?

How to remove not matching values from sub-document from MongoDB collection?

我的 mongoDB collection.

中有以下文档
{"key":"CarName","value":{"default":"Unknown","MyCar":"TNK1234","YourCar":"TNW2342"}}

在这个文档中,我只想保留 "MyCar" 项在 value sub-document 中。

我试过了

db.mycollection.update({{"key":"CarName"},{value.MyCar:0}},{$pull:{value.MyCar:0}});

但是整个文档正在被删除。不确定语法。

我希望文档看起来像

{'key': 'CarName', 'value': {'TNK1234': 'My Car'}}

对评论的一些建议

我试过了

db.mycollection.update({"key":"CarName"},{$unset:{"value.default:"","value.YourCar":""}});

有效

但如果我有多个字段要取消设置,我将不得不提及所有我想删除的字段,所以我正在寻找替代方案。

如果您使用的是 MongoDB 4.2,您可以指定一个管道来处理更新。实现这一目标的一种方法是:

  • 将对象转换为键值对数组
  • 过滤数组,只保留你想要的键
  • 将数组转换回对象
  • 将值存储回原始字段
db.mycollection.update({"key":"CarName"},
                       [{$set: {
                          value: {
                            $arrayToObject: {
                              $filter: {
                                        input: {$objectToArray: "$value"},
                                        cond: {$eq: ["$$this.k","MyCar"]}
                              }
                            }
                          }
                       }}]
)

Mongo playground 不支持更新,但这演示了管道阶段将执行的操作:Playground