我有一个user_batch系列。它载有下列文件:
[{
_id: ObjectId("594baf96256597ec035df23c"),
name: "Batch 1",
batchSize: 30,
users:[]
},
{
_id: ObjectId("594baf96256597ec035df234"),
name: "Batch 2",
batchSize: 50,
users:[]
}]在查找查询中,我希望只投影名称和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和name。但是,如果我通过batchSize,那么它将返回整个文档。
注意:在Mongo Shell中执行此查询时,我没有面临此问题
发布于 2017-07-14 09:17:25
正确的是,驱动程序错误地将其解释为batchSize选项,并忽略了投影语句。
在现代驱动程序版本中,正确的方法是实际使用.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()。
发布于 2018-05-31 14:16:35
Find的语法发生了变化。下面是我需要知道的来解决这个问题。这是从https://github.com/mongodb/node-mongodb-native/blob/master/CHANGES_3.0.0.md#find摘录的。
发现
find和findOne不再支持fields参数。您可以通过使用fields或在options对象上传递projection属性来实现与projection参数相同的结果。此外,find不支持单独的选项,如skip和limit作为位置参数。您必须在options对象中传入这些参数,或者通过Cursor方法(如Cursor.prototype.skip )添加它们。
2.x语法:
const cursor = coll.find({ a: 42 }, { someField: 1 });3.x语法:
const cursor = coll.find({ a: 42 }).project({ someField: 1 });
/* OR */
const cursor = coll.find({ a: 42 }, { projection: { someField: 1 } });https://stackoverflow.com/questions/45098742
复制相似问题