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

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

如何通过 index 删除 interests 数组的第三个元素?

{
  "_id" : ObjectId("4d1cb5de451600000000497a"),           
  "name" : "dannie",  
  "interests" : [  
    "guitar",  
    "programming",           
    "gadgets",  
    "reading"  
  ]   
}

这是我目前的解决方案:

var interests = db.people.findOne({"name":"dannie"}).interests;  
interests.splice(2,1)  
db.people.update({"name":"dannie"}, {"$set" : {"interests" : interests}});

有没有更直接的方法?

最佳答案

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

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

db.lists.update({}, {$unset : {"interests.3" : 1 }}) 
db.lists.update({}, {$pull : {"interests" : null}})

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

  • 从数据库中读取文档
  • 更新文档并删除数组中的项目
  • 替换数据库中的文档。为确保文档 self 们阅读后没有更改,如果当前模式描述为 in the mongo docs,我们可以使用更新

https://stackoverflow.com/questions/4588303/

相关文章:

node.js - 如何获得 Mongoose 模型的所有计数?

mongodb - GridFS 对于生产来说是否足够快速和可靠?

javascript - 在NodeJS中获取Mongo数据库中插入文档的_id

mongodb - 为什么 Mongoose 既有模式又有模型?

macos - 无法连接到mongodb errno :61 Connection refused

linux - 无法连接到服务器 127.0.0.1 shell/mongo.js

mongodb - Mongoose 的 $or 条件的 find 方法无法正常工作

python - 类型错误 : ObjectId ('' ) is not JSON seriali

arrays - mongodb通过多个数组项查找

node.js - ( Node :3341) DeprecationWarning: Mongoo