近来研究node_club源码,因而也对其中使用的mongodb数据库的第三方驱动有一定的了解,但是一直有一个疑问,也就是mongoose模块中的find()方法的疑问。find()方法的原型为:
Model.find(query, fields, options, callback);
其中 Model 为 Mongoose 模型对象。 query参数与 MongoDB 查询条件一致。
fields 指定查询的键,一般我们需要哪些键就指定哪些,以节省系统内存消耗,输入 [],则查询所有的键。
options 选项,有 limit, skip, populate 等等。
callback 则是回调函数,查询完毕后执行。该回调函数支持传入两个参数,分别为 err 和 result,如果 err 为非假则说明查询发生了错误,可以 console.log(err) 将错误打印到控制台;如果 result 为假,则说明没有查到符合条件的数据。 如果按照官网的说明,如果指定fields,比如[’_id’],那么查询出来的结果应该是只含有各种_id的数组,而不应该是整个文档(也就相当于一条完整的记录),但是经过自己的试验,发现结果并非如此,以下是测试代码:
var models = require('./models');
var Topic = models.Topic;
Topic.find({reply_count:4},['_id'],[],function(err,docs){
console.log(docs[0]);
});
跑出来的结果却是:
很明显,返回的结果并非只是我们指定的好的_id,而是包含_id的整个文档。试验的结果告诉我好像官方的文档有些问题,不知道大大们有没有这方面的疑虑,还是我自己对官网文档存在某方面的误解!!!
id的指定是一个json格式对象,应该想下面这样: {_id: 0, author_id:1},0:表示不获取,1表示获取该字段。
Topic.find({reply_count:4}, [’_id’], function(err, docs){ console.log(docs[0]); });
这样就可以了.
MongoDB权威指南如是说: