首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在mongoDb中,如何通过索引删除数组元素?

在mongoDb中,如何通过索引删除数组元素?
EN

Stack Overflow用户
提问于 2011-01-04 04:58:01
回答 10查看 76.2K关注 0票数 101

在下面的示例中,假设文档位于db.people集合中。

如何通过interests数组的索引删除数组的第三个元素

代码语言:javascript
运行
复制
{
  "_id" : ObjectId("4d1cb5de451600000000497a"),           
  "name" : "dannie",  
  "interests" : [  
    "guitar",  
    "programming",           
    "gadgets",  
    "reading"  
  ]   
}

这是我目前的解决方案:

代码语言:javascript
运行
复制
var interests = db.people.findOne({"name":"dannie"}).interests;  
interests.splice(2,1)  
db.people.update({"name":"dannie"}, {"$set" : {"interests" : interests}});

有没有更直接的方法?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2011-01-04 06:19:38

没有通过数组索引直接拉/移的方法。事实上,这是一个开放的问题http://jira.mongodb.org/browse/SERVER-1014,你可以投票支持它。

解决方法是先使用$unset,然后使用$pull:

代码语言:javascript
运行
复制
db.lists.update({}, {$unset : {"interests.3" : 1 }}) 
db.lists.update({}, {$pull : {"interests" : null}})

更新:正如在一些评论中提到的,这种方法不是原子的,如果其他客户端在两个操作之间读取和/或写入,则可能会导致一些竞争条件。如果我们需要操作是原子的,我们可以:

从database

  • Update
  • 中读取文档,并删除数组中的项
  • 替换数据库中的文档。为了确保文档在阅读后没有更改,我们可以使用update if current pattern described in the mongo docs
票数 148
EN

Stack Overflow用户

发布于 2012-10-30 09:08:13

您可以使用update操作的$pull修饰符来移除数组中的特定元素。如果您提供的查询如下所示:

代码语言:javascript
运行
复制
db.people.update({"name":"dannie"}, {'$pull': {"interests": "guitar"}})

此外,您还可以考虑使用$pullAll删除所有匹配项。有关这方面的更多信息,请访问官方文档页面- http://www.mongodb.org/display/DOCS/Updating#Updating-%24pull

这不会使用索引作为删除元素的标准,但在类似于您的情况下仍然可能会有所帮助。据我所知,使用索引来寻址数组中的元素并不是很可靠,因为mongodb在元素顺序上并不一致。

票数 19
EN

Stack Overflow用户

发布于 2020-06-24 17:22:17

在Mongodb 4.2中,您可以这样做:

代码语言:javascript
运行
复制
db.example.update({}, [
     {$set: {field: {
           $concatArrays: [ 
                  {$slice: ["$field", P]}, 
                  {$slice: ["$field", {$add: [1, P]}, {$size: "$field"}]}
           ]
     }}}
]);

P是要从数组中删除的元素的索引。

如果要从P中删除,直到结束:

代码语言:javascript
运行
复制
db.example.update({}, [
     {$set: {field: {$slice: ["$field", P]}}
]);
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4588303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档