仅删除(更新查询)数组mongodb数组中的特定元素?
Posted
技术标签:
【中文标题】仅删除(更新查询)数组mongodb数组中的特定元素?【英文标题】:Remove (Update query) only particular element in array of array mongodb? 【发布时间】:2020-04-03 22:20:25 【问题描述】:我的输入数据
_id: 1,
results: [
item: "A", score: 5, answers: [ q: 1, a: 4 , q: 2, a: 6 ] ,
item: "B", score: 8, answers: [ q: 1, a: 8 , q: 2, a: 9 ]
]
_id: 2,
results: [
item: "C", score: 8, answers: [ q: 1, a: 8 , q: 2, a: 7 ] ,
item: "B", score: 4, answers: [ q: 1, a: 0 , q: 2, a: 8 ]
]
预期的更新查询输出
_id: 1,
results: [
item: "A", score: 5, answers: [ q: 1, a: 4 , q: 2, a: 6 ] ,
item: "B", score: 8, answers: [ q: 1, a: 8 ]
]
_id: 2,
results: [
item: "C", score: 8, answers: [ q: 1, a: 8 , q: 2, a: 7 ] ,
item: "B", score: 4, answers: [ q: 1, a: 0
]
在这些 mongoDb 手册中尝试查询 $pull 但数据不符合预期。下面代码的输出只是删除了整个元素而不是子元素
db.collection.update(
,
$pull: results: $elemMatch: score: 8 , item: "B" ,
multi: true
)
【问题讨论】:
你想删除什么? 什么版本的 MongoDB? 【参考方案1】:您使用的查询是从结果数组中删除任何 score = 'B' 和 item = '8' 的项目。
answers 数组嵌入在 results 数组中,因此如果您需要从 answers 数组中删除一些元素,那么您必须将检查添加到答案而不是结果 例如,如果您需要删除 q = 1 和 a = 8 的答案 那么查询应该是这样的:
db.collection.update(
,
$pull: 'results.$[].answers': q: 1, a: 8 ,
multi: true
)
这将更新答案数组,而不是结果数组, 此查询的结果将是
_id: 1,
results: [
item: "A", score: 5, answers: [ q: 1, a: 4 , q: 2, a: 6 ] ,
item: "B", score: 8, answers: [ q: 2, a: 9 ]
]
_id: 2,
results: [
item: "C", score: 8, answers: [ q: 2, a: 7 ] ,
item: "B", score: 4, answers: [ q: 1, a: 0 , q: 2, a: 8 ]
]
【讨论】:
以上是关于仅删除(更新查询)数组mongodb数组中的特定元素?的主要内容,如果未能解决你的问题,请参考以下文章
mongodb更新查询删除命令中指定的字段以外的所有数组字段
mongodb更新查询删除命令中指定的字段以外的所有数组字段