根据元素的位置删除mongoDB中的数组元素

时间:2011-02-11 13:53:00

标签: arrays mongodb pull

实际上我需要根据它的位置从数组中删除一个元素。使用$ pop我们可以从顶部或底部删除元素(将其视为堆栈。顶部的第0个元素),如here所述。

我们也可以使用$ pull按照数组中元素的值从数组中删除元素,如here所述。

但我需要根据位置从数组中删除元素。那么我有什么方法可以做到这一点。

3 个答案:

答案 0 :(得分:7)

来自文档:

{ $pull : { field : {$gt: 3} } } removes array elements greater than 3

所以我想你现在可以做这样的事情:

{ $pull : { field : {$gt: 3, $lt: 5} } } // shoud remove elemet in 4 position 

或者尝试使用position operator进行更新,我想应该是这样的:

  { $pull : "field.4" } 

  { $pull : {"field.$": 4}}

这只是一个建议,因为我现在无法测试它。

<强>更新

似乎你不能一步到位就知道(有bug in jira}

但你可以在位置使用未设置元素并使用空值拉取元素:

{$unset : {"array.4" : 1 }}
{$pull : {"array" : null}}

答案 1 :(得分:1)

这是使用最新的mongodb v4.2做到这一点的方法,虽然丑陋但仍有效

     _id: ObjectId("5e4539cb6aebbeaa0a6b8fe7") 
   }, [
        { $set: 
          { notes: 
            { 
              $concatArrays: [
                { $slice: ['$notes', 4] }, 
                { $slice: ['$notes', { $add: [1, 4] }, { $size: '$notes' }]}
              ] 
            } 
          } 
        }
      ])```

答案 2 :(得分:0)

这是你的回答MongoDB pull array element from a collection

要首先从某个文档的数组中删除特定元素,您需要标识此元素。例如,我有一个带数组的文档,这个数组的每个元素都是一个对象:

`{
    "_id" : ObjectId("5140f34888dd50971900002d"),
    "_permissions" : {
        "edit" : [
            {
                "profile_id" : NumberLong(123),
                "comment" : "app/project owner"
            },
            {
                "profile_id" : NumberLong("153579099841888257"),
                "comment" : "project admin"
            },
            {
                "profile_id" : NumberLong("153579095869882369"),
                "comment" : "project admin"
            }
        ],
        "view" : [
            {
                "profile_id" : NumberLong(123),
                "comment" : "app/project owner"
            },
            {
                "profile_id" : NumberLong("153579099841888257"),
                "comment" : "project admin"
            },
            {
                "profile_id" : NumberLong("153579095869882369"),
                "comment" : "project admin"
            }
        ]
    }
}`

所以让我们从“_permissions.view”数组中删除带有“153579099841888257”值的“profile_id”。 我们走了

`db.collection.update({_id: ObjectId("5140f34888dd50971900002d")}, {$pull:{"_permissions.view": {"profile_id": NumberLong("153579099841888257")}}});`
  1. 我定义了对象的范围(以确保id不会影响任何其他第一个找到的文档)
  2. 确定要拔出的所需元素:“profile_id”在“_permissions.view”数组中包含“153579099841888257”值