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希望将其从单个阵列中删除,我可以更新答案以反映这一点。