繁体   English   中英

MongoDB 使用正则表达式过滤动态键和值的文档

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM