首页 > 解决方案 > 当任何字段名称与字符串列表中的任何项目匹配时删除 MongoDB 文档

问题描述

我可以删除具有与给定字符串列表中的任何项目匹配的字段的 MongoDB 文档吗?例如,我想从以下演示中删除包含单词 ['Garbage', 'spam', 'useless'] 的子文档:

{
    _id: 24752893,
    dictionary: {
        word1: {
            language: ....,
            count: ....,
        },
        word2: {
            language: ....,
            count: ....,
        },
        word3: {
            language: ....,
            count: ....,
        },
        ....
    }
},
{
    _id: 6786765789,
    dictionary: {
        word1: {
            language: ....,
            count: ....,
        },
        word3: {
            language: ....,
            count: ....,
        },
        garbage: {
            language: ....,
            count: ....,
        },
        ....
    }
},
........
{
    _id: 76675567,
    dictionary: {
        spam: {
            language: ....,
            count: ....,
        },
        useless: {
            language: ....,
            count: ....,
        },
        word2: {
            language: ....,
            count: ....,
        },
        ....
    }
}

我想保持其余的话不变。当字段值与列表中的任何项目匹配时,我已经看到了许多解决方案。有没有办法将字段名称与字符串列表中的项目匹配?

标签: mongodbaggregation-framework

解决方案


解决方案#1

let filter = ["garbage", "spam", "useless"];

db.dictionaris.aggregate([
    {
        $addFields: {
            dictionary: {
                $arrayToObject: {
                    $filter: {
                        input: { $objectToArray: "$dictionary" },
                        as: "item",
                        cond: {
                            $not: [{ $in: ["$$item.k", filter] }]
                        }
                    }
                }
            }
        }
    },
    {
        $out: "dictionaris"
    }
]);

注意:$out:获取聚合管道返回的文档并将它们写入指定的集合。$out 运算符必须是管道中的最后一个阶段。

解决方案 #2:对于 MongoDB 版本 >= 4.4

let filter = ["garbage", "spam", "useless"];

db.dictionaris.updateMany({},
    [
        {
            $set: {
                dictionary: {
                    $arrayToObject: {
                        $filter: {
                            input: { $objectToArray: "$dictionary" },
                            as: "item",
                            cond: {
                                $not: [{ $in: ["$$item.k", filter] }]
                            }
                        }
                    }
                }
            }
        }
    ]
);

测试数据:

/* 1 */
{
    "_id" : 24752893,
    "dictionary" : {
        "word1" : {
            "language" : "Some word",
            "count" : "Some word"
        },
        "word2" : {
            "language" : "Some word",
            "count" : "Some word"
        },
        "word3" : {
            "language" : "Some word",
            "count" : "Some word"
        }
    }
},

/* 2 */
{
    "_id" : 6786765789,
    "dictionary" : {
        "word1" : {
            "language" : "Some word",
            "count" : "Some word"
        },
        "word3" : {
            "language" : "Some word",
            "count" : "Some word"
        },
        "garbage" : {
            "language" : "Some word",
            "count" : "Some word"
        }
    }
},

/* 3 */
{
    "_id" : 76675567,
    "dictionary" : {
        "spam" : {
            "language" : "Some word",
            "count" : "Some word"
        },
        "useless" : {
            "language" : "Some word",
            "count" : "Some word"
        },
        "word2" : {
            "language" : "Some word",
            "count" : "Some word"
        }
    }
}

输出:

/* 1 */
{
    "_id" : 24752893,
    "dictionary" : {
        "word1" : {
            "language" : "Some word",
            "count" : "Some word"
        },
        "word2" : {
            "language" : "Some word",
            "count" : "Some word"
        },
        "word3" : {
            "language" : "Some word",
            "count" : "Some word"
        }
    }
},

/* 2 */
{
    "_id" : 6786765789,
    "dictionary" : {
        "word1" : {
            "language" : "Some word",
            "count" : "Some word"
        },
        "word3" : {
            "language" : "Some word",
            "count" : "Some word"
        }
    }
},

/* 3 */
{
    "_id" : 76675567,
    "dictionary" : {
        "word2" : {
            "language" : "Some word",
            "count" : "Some word"
        }
    }
}

推荐阅读