Mongo与MongoClient执行相同投影查询结果不一致问题
解决MongoClient在Express中投影查询返回所有字段的问题
我刚碰到过几乎一模一样的坑!问题出在Mongo Shell的语法和Node.js MongoClient API的参数差异上——这是个新手很容易踩的点,别慌,咱们一步步解决。
问题根源
在Mongo Shell里,find()的第二个参数可以直接传投影对象(比如{ "_id": 1 }),但在新版MongoDB Node.js驱动(v4.x及以上)中,find()的第二个参数是全局配置选项对象,投影规则需要嵌套在projection属性里。如果直接把投影对象当第二个参数传,驱动会识别不到你的投影要求,自然就返回所有字段了。
两种修复方案
方案1:将投影放在options的projection字段中
这是符合新版驱动API规范的标准写法:
const MongoClient = require('mongodb').MongoClient; async function fetchTargetIds() { const uri = 'mongodb://localhost:27017/your-database-name'; const client = new MongoClient(uri); try { await client.connect(); const collection = client.db().collection('gholson'); // 正确写法:投影规则嵌套在projection属性内 const results = await collection.find({}, { projection: { "_id": 1 } }) .skip(85) .limit(2) .toArray(); console.log(results); // 现在只会返回_id字段 } finally { await client.close(); } } fetchTargetIds();
方案2:使用链式project()方法
如果你更习惯Mongo Shell的写法,可以用project()链式调用,效果完全一致:
const results = await collection.find({}) .project({ "_id": 1 }) // 直接在这里传入投影规则 .skip(85) .limit(2) .toArray();
小提醒
如果你用的是v3.x及以下的旧版驱动,直接传投影对象确实有效,但这种写法已经被标记为废弃,未来版本会移除,建议尽快切换到新版写法。
内容的提问来源于stack exchange,提问作者kinny94
相关产品推荐
相关产品推荐

