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

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

在上面的例子中,假设上面的文档在db.people集合中。 如何通过它的索引去除interest数组的第三个元素?

编辑:

这是我目前的解决scheme:

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

有更直接的方法吗?

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

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

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

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

  • 从数据库中读取文档
  • 更新文档并删除数组中的项目
  • replace数据库中的文档。 为了确保文档在读取之后没有改变,我们可以使用mongo文档中描述的当前模式进行更新

您可以使用update操作的$pull修饰符来移除数组中的特定元素。 如果你提供了一个查询将看起来像这样:

 db.people.update({"name":"dannie"}, {'$pull': {"interests": "guitar"}}) 

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

这不会使用索引作为删除元素的标准,但仍可能有助于类似于您的情况。 国际海事组织,使用索引寻址数组内的元素是不是很可靠,因为mongodb是不一致的元素顺序为我所知的法斯。

我会build议使用一个GUID(我倾向于使用ObjectID)字段或数组中的每个子文档的自动递增字段。

使用这个GUID很容易发出$ pull,并确保正确的拉动。 其他数组操作也一样。

而不是使用未设置(如在接受的答案),我通过设置字段为一个唯一的值(即不是NULL),然后立即拉动该值解决这个问题。 从不同的angular度来看,安全性更高一些。 这里是代码:

  var update = {}; var key = "ToBePulled_"+ new Date().toString(); update['feedback.'+index] = key; Venues.update(venueId, {$set: update}); return Venues.update(venueId, {$pull: {feedback: key}}); 

希望mongo能解决这个问题,也许是通过扩展$ position修饰符来支持$ pull和$ push。