Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 根据元素的位置删除mongoDB中的数组元素_Arrays_Mongodb_Pull - Fatal编程技术网

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

Arrays 根据元素的位置删除mongoDB中的数组元素,arrays,mongodb,pull,Arrays,Mongodb,Pull,实际上,我需要根据元素的位置从数组中删除一个元素。使用$pop,我们可以从顶部或底部删除元素(将其视为顶部的堆栈。第0个元素),如前所述 我们还可以根据数组中元素的值,使用$pull从数组中删除元素,如前所述 但我需要根据位置从数组中删除元素。那么我有什么办法可以做到这一点。来自文档: { $pull : { field : {$gt: 3} } } removes array elements greater than 3 所以我想你现在可以做这样的事情: { $pull : { field

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

我们还可以根据数组中元素的值,使用$pull从数组中删除元素,如前所述

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

来自文档:

{ $pull : { field : {$gt: 3} } } removes array elements greater than 3
所以我想你现在可以做这样的事情:

{ $pull : { field : {$gt: 3, $lt: 5} } } // shoud remove elemet in 4 position 
或者尝试使用更新,我想应该是这样的:

  { $pull : "field.4" } 

  { $pull : {"field.$": 4}}
这只是一个建议,因为我现在不能测试它

更新:

似乎你不可能一步到位(有这样的)

但您可以在位置中使用unset元素删除并使用null值拉取元素:

{$unset : {"array.4" : 1 }}
{$pull : {"array" : null}}
以下是你的答案:

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

{
“_id”:ObjectId(“5140f34888dd50971900002d”),
“_权限”:{
“编辑”:[
{
“配置文件id”:编号长(123),
“评论”:“应用程序/项目所有者”
},
{
“配置文件id”:数字长(“153579099841888257”),
“注释”:“项目管理员”
},
{
“配置文件id”:数字长(“153579095869882369”),
“注释”:“项目管理员”
}
],
“视图”:[
{
“配置文件id”:编号长(123),
“评论”:“应用程序/项目所有者”
},
{
“配置文件id”:数字长(“153579099841888257”),
“注释”:“项目管理员”
},
{
“配置文件id”:数字长(“153579095869882369”),
“注释”:“项目管理员”
}
]
}
}
因此,让我们从
\u权限中删除带有“153579099841888257”值的
profile\u id
。 我们开始

db.collection.update({_id: ObjectId("5140f34888dd50971900002d")}, {$pull:{"_permissions.view": {"profile_id": NumberLong("153579099841888257")}}});
  • 我定义了对象的范围(以确保id不会影响任何其他最先找到的文档)
  • 确定要拉出的所需元素:
    profile\u id
    ,在
    权限中使用“153579099841888257”值。查看
    数组

  • 这就是在最新的mongodb v4.2中实现这一点的可能性,虽然很难看,但仍能正常工作

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

    在多任务环境中,这不是一个特别安全的操作。如果两个线程几乎同时尝试移除元素4会怎么样?幂等或原子操作通常是所有数据库操作所需的操作。这样做会导致错误:“无法同时更新array.4和array”