gpt4 book ai didi

mongodb - 如何从 MongoDB 文档中的双重嵌套数组中删除元素

转载 作者:IT老高 更新时间:2023-10-28 11:02:53 25 4
gpt4 key购买 nike

我的文档结构类似于以下内容:

{
"_id" : "777",
"someKey" : "someValue",
"someArray" : [
{
"name" : "name1",
"someNestedArray" : [
{
"name" : "value"
},
{
"name" : "delete me"
}
]
}
]
}

我想删除值为“delete me”的嵌套数组元素。

我知道我可以使用嵌套的 $elemMatch 表达式找到与此描述匹配的文档。删除相关元素的查询语法是什么?

最佳答案

要删除有问题的项目,您实际上将使用更新。更具体地说,您将使用 $pull 命令进行更新,该命令将从数组中删除项目。

db.temp.update(
{ _id : "777" },
{$pull : {"someArray.0.someNestedArray" : {"name":"delete me"}}}
)

这里发生了一点“魔法”。使用 .0 表示我们知道我们正在修改 someArray 的第 0 项。使用 {"name":"delete me"} 表示我们知道我们计划删除的确切数据。

如果您将数据加载到客户端然后执行更新,此过程就可以正常工作。如果您想要执行执行这些操作的“通用”查询,则此过程效果较差。

我认为最简单的方法是简单地认识到更新子文档数组通常需要您在某个时候在内存中拥有原始文档。


针对下面的第一条评论,您可能可以通过稍微改变数据结构来帮助您的情况

"someObjects" : {
"name1": {
"someNestedArray" : [
{
"name" : "value"
},
{
"name" : "delete me"
}
]
}
}

现在你可以做 {$pull : { "someObjects.name1.someNestedArray": ...

这是您的结构的问题。 MongoDB 对操作“子数组”没有很好的支持。您的结构有一个对象数组,而这些对象包含更多对象的数组。

如果你有以下结构,你将很难使用像 $pull 这样的东西:

array [
{ subarray : array [] },
{ subarray : array [] },
]

如果你的结构看起来像 并且 你想更新 subarray 你有两个选择:

  1. 改变你的结构,以便你可以利用 $pull
  2. 不要使用 $pull。将整个对象加载到客户端并使用 findAndModify

关于mongodb - 如何从 MongoDB 文档中的双重嵌套数组中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5228210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com