mongodb - 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"
}
}
任何帮助,将不胜感激。谢谢。
解决方案
您可以使用$ 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" }
}
}
])
推荐阅读
- hashtable - 编程语言对字典/关联数组使用的默认哈希函数是什么?
- r - 加入 data.table 保留列 ID
- php - php echo函数不打印结果
- dictionary - 在 Flutter 中使用 Map 制作下拉菜单
- reactjs - 在 React 应用程序中处理外部注销
- c++ - 这个表达式是 xvalue 吗?
- python-3.x - Tkinter 如何在窗口中间制作按钮
- ios - 如何使用 OpenCV 创建 iOS Objective-C 项目
- python-3.x - Cryptopals 挑战 4 个问题
- c++ - C++ 与 MATLAB 中的 Sin 和 cos 函数