mongodb - 如何从 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":""}});
哪个有效
但是如果我有多个字段要取消设置,我将不得不提及我想要删除的所有字段,所以我正在寻找替代方案。
解决方案
如果您使用的是 MongoDB 4.2,则可以指定一个管道来处理更新。实现这一目标的一种方法是:
- 将对象转换为键值对数组
- 过滤数组,只保留你想要的键
- 将数组转换回对象
- 将值存储回原始字段
db.mycollection.update({"key":"CarName"},
[{$set: {
value: {
$arrayToObject: {
$filter: {
input: {$objectToArray: "$value"},
cond: {$eq: ["$$this.k","MyCar"]}
}
}
}
}}]
)
Mongo Playground 不支持更新,但这展示了该管道阶段会做什么:Playground
推荐阅读
- php - 如果元素有这个或那个类,如何使用 getElementsByTagName()?
- asp.net - C# Entity Framework - 验证记录是否成功保存的最佳实践
- c# - Nunit -Check method was called with a parameter
- r - 用动态名称替换一列中的 NA
- javascript - Javascript 类 Getter Setter
- sql-server - SQL Server:将唯一标识符更改为字符串
- git - 合并 Bitbucket 中的两个分支
- c++ - 嗨,我的名字是亚当莱特,我该如何使用这个
- jquery - 无法使用 jquery post 访问 Modern Warfare API
- histogram - Plotly:连续直方图颜色