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

Mongodb 从子文档数组中的数组中删除子文档,mongodb,mongodb-query,Mongodb,Mongodb Query,让我们想象一个蒙哥人的收藏,比如说杂志。出于某种原因,我们最终将杂志的每期作为单独的文档存储。每篇文章都是文章-数组中的子文档,每篇文章的作者都表示为文章-子文档上作者-数组中的子文档。文章中只存储作者的姓名和电子邮件,但杂志级别上有一个Writers-数组,包含关于每个作者的更多信息 { "Title": "The Magazine", "Articles": [ { "Title": "Mongo Queries 101", "Summary

让我们想象一个蒙哥人的收藏,比如说杂志。出于某种原因,我们最终将杂志的每期作为单独的文档存储。每篇文章都是
文章
-数组中的子文档,每篇文章的作者都表示为
文章
-子文档上
作者
-数组中的子文档。文章中只存储作者的姓名和电子邮件,但杂志级别上有一个
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引入了一些新的占位符操作符,
$[]
$[]
,我怀疑它们可以与
$pull
$pullAll
一起使用,但到目前为止,我还没有取得任何成功


能一次完成吗?或者至少不超过两个?一个查询用于从所有文章中删除作者,另一个查询用于从杂志中删除传记?

您可以在下面的查询中尝试

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

你能给我提供一个样本数据集吗?我对样本文档做了一些扩展。应该足够了。尝试删除
{“Name”:“tom”,“Email”:tom@example.com“}
来自文档。您需要同时匹配
名称
电子邮件
。单靠这两种方法都是不够的。当我第一次阅读答案时,我没想到这会起作用,但在尝试之后,它确实起了作用。但是怎么做??我至少希望
文章
作者
部分需要以某种方式分开。你能解释一下吗?运算符获取具有键(数组字段)和值(查询条件)对的文档。第一个键值部分是更新文章中的Writers数组,该数组是键,使用位置all运算符将该值作为查询条件。第二个键值部分是更新文章之外的Writers数组,它是键,使用查询条件作为值。@Veeram为什么我们需要使用
文章。$[].Writers
而不是
文章。$.Writers
在这里?砰!既然已经定义了查询,那么mlabs仍然没有提供3.6数据库。甚至在沙箱里也没有。每次有新的mongo版本时都会出现同样的问题。在mLabs提供支持之前需要很长时间。我猜今年我们将不得不放弃它们…@Rahul Raj说实话,我刚刚查看了两个数组中的
anna
记录,并假设OP希望从所有数组中删除。如果Op希望将其从单个阵列中删除,我可以更新答案以反映这一点。