arrays - 如何从MongoDB中的所有子数组中删除元素
问题描述
如何删除“newFor”中的所有“aFHJBrKu54y5mWjY3”?
尝试这样做,但它不起作用。
Messages.update({
users: { $all: ["CnugxoBWs4ox6vG2k", "aFHJBrKu54y5mWjY3"] }
},
{
$pull: {
"messages.$.newFor": "aFHJBrKu54y5mWjY3"
}
},
{ multi: true }
);
{
"_id" : "gQnYi2e54zADwgipx",
"users" : [
"aFHJBrKu54y5mWjY3",
"CnugxoBWs4ox6vG2k"
],
"lastMessageAt" : ISODate("2020-06-22T22:50:35.579Z"),
"messages" : [
{
"id" : "4d2219d05645a3991d3aae89",
"addedAt" : ISODate("2020-06-22T22:50:35.579Z"),
"userId" : "CnugxoBWs4ox6vG2k",
"newFor" : [
"aFHJBrKu54y5mWjY3",
"CnugxoBWs4ox6vG2k"
],
"message" : "Test"
},
{
"id" : "b42641118bb080cb9122062f",
"addedAt" : ISODate("2020-06-22T22:48:24.359Z"),
"userId" : "aFHJBrKu54y5mWjY3",
"newFor" : [
"aFHJBrKu54y5mWjY3"
],
"message" : "Test 2"
},
{
"id" : "244e77bb8324dc0b0f0e2def",
"addedAt" : ISODate("2020-06-22T22:48:14.643Z"),
"userId" : "CnugxoBWs4ox6vG2k",
"newFor" : [
"aFHJBrKu54y5mWjY3"
],
"message" : "Test 3"
}
]
}
解决方案
位置运算符 $
仅匹配满足查询的第一个数组元素。由于您没有messages
在查询中指定任何条件,因此它不会匹配任何内容。
为了从newFor
嵌套在数组中的匿名对象中的每个数组中删除元素messages
,您需要迭代messages
数组,并分别过滤每个newFor
数组。
如果您使用的是 MongoDB 4.2+,则只能在单个更新命令中使用更新数据库命令的管道形式。
db.messages.update({},[
{$set:{
messages:{
$map:{
input:"$messages",
in:{
$mergeObjects:[
"$$this",
{newFor:{
$filter:{
input:"$$this.newFor",
as:"new",
cond:{$not:{$in:[
"$$new",
["aFHJBrKu54y5mWjY3","CnugxoBWs4ox6vG2k"]
]}}
}
}}
]
}
}
}
}}
])
推荐阅读
- android - 如何使用 EventBus 从 Fragment 向 Fragment 发送数据?
- spring-boot - WebSocket 握手期间出错:“Sec-WebSocket-Accept”标头值不正确
- c# - 收藏已修改;即使在锁定语句中专门修改了集合,枚举操作也可能不会执行
- java - OPCUA Milo-Stack-Core Failure - 构建阶段
- javascript - 如何在javascript中使用ajax重定向到搜索结果的下一页
- automation - 如何处理 Robot Framework 中的警报?
- jquery - 未设置 JQuery 偏移量
- ssl - curl: (7) 连接 xx.xx.xx.xx:80 失败;拒绝连接
- python - Python NetworkX - 为什么图形总是随机旋转?
- opencv - 架构 arm64 的未定义符号:cv::StereoMatcher::compute