[英]MongoDB filter docs on dynamic key and value using regex
假设我在一个文档中有多个字段我不知道其键值(只有添加了键的用户才知道)
现在假设用户想要找到一个指定键值的文档,但他忘记了他的键值是什么
所以说我有这个文件:
name: "John Doe"
class: 5
MisChief: "Bullying"
MisChief 键是自定义创建的。
假设用户想要搜索“恶作剧:欺凌”
我可以使用$regex
运算符来搜索值,但是如何将键指定为正则表达式?
另一种方法是返回所有文档,并对所有这些文档中的键进行不区分大小写的搜索,这是非常低效的。
因此,对于未知/动态/随机键名,一种使用聚合运算符$objectToArray
的方法:
db.collection.aggregate([
/** Add a new array field to all docs which contains each field as {k:...,v:...} */
{
$addFields: { data: { $objectToArray: "$$ROOT" } }
},
/** Match docs that has an object in `data` array which matches with input */
{
$match: { "data": { "$elemMatch": { "k": "MisChief", "v": "Bullying" } } } // can be a regex /MisChief/i
},
/** Remove added array field from output */
{
$project: { "data": 0 }
}
])
测试: mongoplayground
参考:聚合
从你的陈述中:
but he forgot what his key value was EXACTLY
如果他模糊地记得键名/值但不完全记得 - 您可以根据需要使用正则表达式! 但是,如果他完全忘记了,那么您将无能为力,只需获取data.v: 'Bullying'
所有文档并使用$match
阶段进一步过滤用户name
。
db.collection.aggregate([
{
$addFields: { data: { $objectToArray: "$$ROOT" } }
},
{
$match: { "data": { "$elemMatch": { "v": "Bullying" } } }
},
{
$project: { "data": 0 }
}
])
测试: mongoplayground
笔记:
对于单个元素{ "v": "Bullying" }
,我们不需要使用$elemMatch
,但为了保持语法一致,我们正在使用它,否则您可以在$match
阶段使用data.v: 'Bullying'
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.