如何从MongoDB打印指定字段内容?排除title字段查询失效问题
MongoDB查询中排除title字段无效的问题解决
首先来看你的问题场景:
我尝试从MongoDB的
books数据库中查询bookdetails集合,期望排除title字段,使用了以下代码:MongoClient.connect(url, function(err, db) { if (err) throw err; var dbo = db.db("books"); dbo.collection("bookdetails").find({}, { title: 0 }).toArray(function(err, result) { if (err) throw err; console.log(result); db.close(); }); });我理解设置
{ title: 0 }应返回除title外的所有字段,但运行代码后仍打印包括title在内的全部内容,请问问题出在哪里?
这个问题几乎可以肯定是Node.js MongoDB驱动版本的语法差异导致的,我来给你拆解清楚:
问题根源
在MongoDB Node.js驱动3.x及更早的版本中,find()方法的第二个参数直接传投影对象(比如{ title:0 })是有效的。但从4.x版本开始,驱动对find()的参数做了规范,第二个参数变成了一个选项对象,投影规则必须放在这个对象的projection属性里,直接传投影对象会被忽略,所以你才会拿到包含所有字段的结果。
修正方案
把你的投影规则包裹在projection字段中,修改后的代码如下:
MongoClient.connect(url, function(err, db) { if (err) throw err; var dbo = db.db("books"); // 关键变化:将投影配置放入projection属性 dbo.collection("bookdetails").find({}, { projection: { title: 0 } }).toArray(function(err, result) { if (err) throw err; console.log(result); db.close(); }); });
额外小提示
- 如果你确认自己用的是旧版驱动但问题依旧,可以检查下文档里的
title字段是否是嵌套结构(比如info.title),这种情况下你需要用"info.title": 0来排除; - MongoDB的投影规则里,除了
_id字段外,不能同时混用包含(field:1)和排除(field:0)规则,不过你这里只排除title,完全符合规则,所以不用顾虑这点。
内容的提问来源于stack exchange,提问作者tiffanie
相关产品推荐
相关产品推荐

