首页 > 解决方案 > 如何从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"
        }
    ]
}

标签: arraysmongodbmongodb-query

解决方案


位置运算符 $仅匹配满足查询的第一个数组元素。由于您没有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"]
                                ]}}
                            }
                         }}
                     ]
                }
             }
        }
    }}
])

推荐阅读