如何在MongoDB中根据对象键过滤文档?
MongoDB根据嵌套对象的键过滤文档的正确写法
你要实现的是像JS里Object.keys(obj.emailsandnames).includes(searchingEmail)那样的过滤逻辑,之前的查询写法有两个关键问题:操作符拼写错误、键名语法不符合MongoDB查询规则。
正确的查询语句
固定邮箱直接查询
如果是查询固定的邮箱地址,以下两种写法都有效:
- 点符号+引号包裹特殊键名
db.collection.find({ "emailsandnames.john@email.tld": { $exists: true } })
- 方括号形式的路径写法(需用引号包裹整个路径)
db.collection.find({ "emailsandnames['john@email.tld']": { $exists: true } })
动态邮箱变量(如Node.js环境)
如果查询的邮箱是变量,用JS计算属性名构造查询条件:
const searchingEmail = "john@email.tld"; const query = { [`emailsandnames.${searchingEmail}`]: { $exists: true } }; // 执行查询 db.collection.find(query);
之前写法的问题
- 操作符拼写错误:你写的
$exist少了末尾的s,正确操作符是$exists - 键名语法错误:MongoDB查询文档不支持
emailsandnames["john@email.tld"]这种JS式的方括号键名写法,必须把整个嵌套字段路径用引号包裹,否则MongoDB会把它当成一个完整的顶层键名,自然匹配不到目标数据
内容的提问来源于stack exchange,提问作者Clara Raquel
相关产品推荐
相关产品推荐

