如何在MongoDB中查询对象内指定键对应的值?
解决MongoDB顶级键对象的检索问题
嘿,我完全懂你的困扰——你的文档结构是把用户作为顶级键(比如user1、user2),想要取出特定键对应的对象,但之前试的查询方式都不对,还不能重构数据结构对吧?别担心,用MongoDB的查询条件+投影就能搞定,下面给你具体方案:
正确的查询方式
1. 筛选包含目标键的文档并返回对应对象
如果你只想获取那些确实存在user1字段的文档,并且只返回user1对应的对象,可以这样写:
// 筛选存在user1字段的文档,仅返回user1对象(排除默认的_id字段) collection.find({ user1: { $exists: true } }, { user1: 1, _id: 0 })
{ user1: { $exists: true } }:这个查询条件用来过滤出所有包含user1字段的文档,不管user1的值是什么(只要它存在)。{ user1: 1, _id: 0 }:这是投影参数,1表示要返回该字段,0表示排除_id字段(如果不需要排除可以去掉_id:0)。
2. 直接返回所有文档中的目标键对象
如果你的集合里所有文档都有user1字段,或者你想返回所有文档的user1字段(不存在的话会显示null),可以省略查询条件,直接用投影:
// 返回所有文档的user1对象(不存在则为null) collection.find({}, { user1: 1, _id: 0 })
3. 获取单个文档的目标键对象
如果你有其他条件可以定位到单个文档(比如某个唯一标识),可以用findOne配合投影:
// 定位到特定文档后,仅返回user1对象 collection.findOne({ someUniqueField: 'targetValue' }, { user1: 1, _id: 0 })
为什么你之前的方法不对?
collection.find({user1}):这是ES6的对象简写语法,相当于collection.find({user1: user1}),但你没有定义user1变量,MongoDB会把它当成值为undefined的查询,自然匹配不到任何结果。var q = {}; q.user1 = ''; collection.find(q):这个查询是在找user1字段的值等于空字符串的文档,而你要的是只要user1字段存在、值是那个对象的文档,所以条件完全不符。
内容的提问来源于stack exchange,提问作者ekkis
相关产品推荐
相关产品推荐

