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