首页 > 解决方案 > MongoDB 根据子对象的键过滤掉子对象

问题描述

有一个 MongoDB 对象,具有以下模式,其中键(key1、key2、key3 可以是动态的,因此手动查询它们不是解决方案)

{
"_id" : <docID>,
"user" : <userID>,
"key1" : {
    "priorityLevel" : "p0",
    "filled" : false,
    "category" : "Basic",
    "fieldType" : "input"
},
"key2" : {
    "priorityLevel" : "p1",
    "filled" : false,
    "category" : "Basic",
    "fieldType" : "input"
},
"key3" : {
    "priorityLevel" : "p0",
    "filled" : false,
    "category" : "Basic",
    "fieldType" : "input"
}
}

现在预期的输出是过滤掉priorityLevel = p0的键并将输出作为

{
"_id" : <docID>,
"user" : <userID>,
"key1" : {
    "priorityLevel" : "p0",
    "filled" : false,
    "category" : "Basic",
    "fieldType" : "input"
},
"key3" : {
    "priorityLevel" : "p0",
    "filled" : false,
    "category" : "Basic",
    "fieldType" : "input"
}
}

任何帮助,将不胜感激。谢谢。

标签: mongodbmongoosemongodb-query

解决方案


您可以使用$ objectToArray您的. 然后你需要$arrayToObject$replaceRoot来恢复你原来的形状,试试:$$ROOT

db.collection.aggregate([
    {
        $project: {
            fields: {
                $filter: {
                    input: { $objectToArray: "$$ROOT" },
                    cond: { 
                        $or: [ 
                            { $ne: [{ $type: "$$this.v" }, "object" ] },
                            { $eq: [ "$$this.v.priorityLevel", "p0" ] }
                        ] 
                    }
                }
            }
        }
    },
    {
        $replaceRoot: {
            newRoot: { $arrayToObject: "$fields" }
        }
    }
])

蒙戈游乐场


推荐阅读