【问题标题】:Delete sub-document from array in array of sub documents从子文档数组中的数组中删除子文档
【发布时间】:2018-03-23 05:30:24
【问题描述】:

让我们想象一个 mongo 集合 - 比如说杂志。出于某种原因,我们最终将每期杂志存储为单独的文档。每篇文章都是Articles-array 内的一个子文档,每篇文章的作者都表示为Article-subdocument 上Writers-array 内的一个子文档。文章中只存储了作者的姓名和电子邮件,但在杂志级别有一个Writers-array 包含有关每个作者的更多信息。

{
   "Title": "The Magazine",
   "Articles": [
     {
       "Title": "Mongo Queries 101",
       "Summary": ".....",
       "Writers": [
         {
           "Name": "tom",
           "Email": "tom@example.com"
         },
         {
           "Name": "anna",
           "Email": "anna@example.com"
         }
        ]
     },
     {
       "Title": "Why not SQL instead?",
       "Summary": ".....",
       "Writers": [
         {
           "Name": "mike",
           "Email": "mike@example.com"
         },
         {
           "Name": "anna",
           "Email": "anna@example.com"
         }
        ]         
      }
   ],
  "Writers": [
     {
       "Name": "tom",
       "Email": "tom@example.com",
       "Web": "tom.example.com"
     },
     {
       "Name": "mike",
       "Email": "mike@example.com",
       "Web": "mike.example.com"
     },
     {
       "Name": "anna",
       "Email": "anna@example.com",
       "Web": "anna.example.com"
     }
   ]
}

如何将一位作者从杂志中彻底删除?

查找不受欢迎的作者所在的杂志非常容易。问题是将作者从所有子文档中拉出来。

MongoDB 3.6 引入了一些新的占位符运算符$[]$[<identity>],我怀疑它们可以与$pull$pullAll 一起使用,但到目前为止,我还没有取得任何成功。

可以一次性完成吗?或者至少不超过两个?从所有文章中删除作者的查询,以及从杂志中删除传记的查询?

【问题讨论】:

  • 你能给我一个样本数据集吗?
  • 我已经稍微扩展了示例文档。应该够了。尝试从文档中删除 { "Name": "tom", "Email": "tom@example.com" }
  • 您需要同时匹配NameEmail。一个人,一个都不够。

标签: mongodb mongodb-query


【解决方案1】:

你可以试试下面的查询。

db.col.update(
  {},
  {"$pull":{
    "Articles.$[].Writers":{"Name": "tom","Email": "tom@example.com"},
    "Writers":{"Name": "tom","Email": "tom@example.com"}
  }},
  {"multi":true}
);

【讨论】:

  • 当我第一次阅读答案时,我没想到它会起作用,但在尝试之后它确实起作用了。但是怎么办??我至少希望ArticlesWriters-parts 需要以某种方式分开。你能解释一下吗?
  • $pull 运算符获取带有键(数组字段)和值(查询条件)对的文档。第一个key-value部分是更新Articles里面的Writers数组,也就是key,使用positional all操作符,value作为查询条件。第二个键值部分是更新Articles之外的Writers数组,也就是键,使用查询条件作为值。
  • @Veeram 为什么我们需要在这里使用Articles.$[].Writers 而不是Articles.$.Writers
  • 然后轰隆隆!现在查询已定义,事实证明 mlabs still 不提供 3.6 数据库。甚至在沙盒中也不行。每次有新的 mongo 版本时都会出现同样的问题。在 mLabs 提供支持之前需要很长时间。猜猜这是我们不得不放弃它们的一年......
  • @Rahul Raj 老实说,我只是查看了两个数组中的 anna 记录,并假设 OP 想要从所有数组中删除。如果 Op 希望将其从单个数组中删除,我可以更新答案以反映这一点。
猜你喜欢
  • 2013-07-23
  • 2020-09-06
  • 2021-02-10
  • 2023-03-28
  • 2017-08-22
  • 2014-12-02
  • 2022-01-09
  • 2016-10-16
  • 1970-01-01
相关资源
最近更新 更多