仅删除(更新查询)数组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更新查询删除命令中指定的字段以外的所有数组字段

如何更新数组NodeJS,MongoDB中的特定对象

使用更新 mongoDB 从 objectId 数组中删除

如何删除 mongodb 特定文档中的数组中的项目? [复制]

仅检索 MongoDB 集合中对象数组中的查询元素