首页 > 解决方案 > 如何从 MongoDB 集合中的子文档中删除不匹配的值?

问题描述

我的 mongoDB 集合中有一个以下文档。

{"key":"CarName","value":{"default":"Unknown","MyCar":"TNK1234","YourCar":"TNW2342"}}

在本文档中,我只想将“MyCar”项保留在value子文档中。

我试过了

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

但是整个文档都被删除了。不确定语法。

我希望文件看起来像

{'key': 'CarName', 'value': {'TNK1234': '我的车'}}

在对评论提出一些建议后

我试过

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

哪个有效

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

标签: mongodbdictionarydocument

解决方案


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

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

Mongo Playground 不支持更新,但这展示了该管道阶段会做什么:Playground


推荐阅读