从子文档数组中的数组中删除子文档

时间:2018-03-22 19:53:27

标签: mongodb mongodb-query

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

{
   "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一起使用,但到目前为止,我还没有没有任何成功。

是否有可能一次性完成这项工作?或者至少不超过两个?从所有文章中删除作者的一个问题,以及从杂志中删除传记的一个查询?

1 个答案:

答案 0 :(得分:1)

您可以尝试以下查询。

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