我有一个user_batch集合。它包含以下文档:
[{ _id: ObjectId("594baf96256597ec035df23c"), name: "Batch 1", batchSize: 30, users:[] }, { _id: ObjectId("594baf96256597ec035df234"), name: "Batch 2", batchSize: 50, users:[] }]
在查找查询中,我只想投影 name 和 batchSize 。但是,当我从nodejs执行find查询时,我会在查询结果中获取整个文档。查询:
db.collection('user_batch').find({}, {name: 1, batchSize: 1}).toArray((err, result) => { if(err) console.log(err) else console.log(result) })
如果我只是通过 {name:1}, 那么它将投影_id和名称。但是,如果我通过 batchSize ,它将返回整个文档。
注意:在Mongo Shell中执行此查询时,我没有遇到此问题
您正确地认为驱动程序将其错误地解释为batchSize选项,而忽略了projection语句。
batchSize
尽管在现代驱动程序版本中,执行此操作的正确方法是实际使用.project()“游标方法”。这与其他语言驱动程序的实现更加一致。
.project()
db.collection('collection').find() .project({ name: 1, batchSize: 1}) .toArray();
作为完整的演示:
const mongodb = require('mongodb'), MongoClient = mongodb.MongoClient; (async function() { let db; try { db = await MongoClient.connect('mongodb://localhost/test'); // New form uses .project() as a cursor method let result = await db.collection('collection').find() .project({ name: 1, batchSize: 1}) .toArray(); console.log(JSON.stringify(result,undefined,2)); // Legacy form confuses this as being a legacy "cursor option" let other = await db.collection('collection') .find({},{ name: 1, batchSize: 1 }) .toArray(); console.log(JSON.stringify(other,undefined,2)); } catch(e) { console.error(e) } finally { db.close() } })()
产生输出:
[ { "_id": "594baf96256597ec035df23c", "name": "Batch 1", "batchSize": 30 }, { "_id": "594baf96256597ec035df234", "name": "Batch 2", "batchSize": 50 } ] [ { "_id": "594baf96256597ec035df23c", "name": "Batch 1", "batchSize": 30, "users": [] }, { "_id": "594baf96256597ec035df234", "name": "Batch 2", "batchSize": 50, "users": [] } ]
如果第一个输出形式是更正的形式,则使用 .project()