当前位置:嗨网首页>书籍在线阅读

04-使用Node.js限制返回的字段

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

20.1.2 使用Node.js限制返回的字段

在方法find()中使用参数fields来减少Cursor对象表示的文档中的字段数 在本节中,您将编写一个简单的Node.js应用程序,它在方法find()中使用参数fields来限制返回的字段。通过这个示例,您将熟悉如何使用方法find()的参数fields,并了解它对结果的影响。程序清单20.3显示了这个示例的代码。 在这个示例中,主脚本连接到MongoDB数据库,获取一个Collection对象,并调用其他的方法来查找文档并显示其指定的字段。方法displayCursor()迭代游标并显示找到的文档。 方法includeFields()接受一个字段名列表,创建参数fields并将其传递给方法find(),使其只返回指定的字段;方法excludeFields()接受一个字段名列表,创建参数fields并将其传递给方法find(),以排除指定的字段。 请执行如下步骤,创建并运行这个Node.js应用程序,它在示例数据集中查找文档,限制返回的字段并显示结果。 1.确保启动了MongoDB服务器。 2.确保下载并安装了Node.js MongoDB驱动程序,并运行了生成数据库words的脚本文件code/hour05/generate_words.js。 3.在文件夹code/hour20中新建一个文件,并将其命名为NodejsFindFields.js。 4.在这个文件中输入程序清单20.3所示的代码。这些代码在调用方法find()时传递了参数fields。 5.将这个文件存盘。 6.打开一个控制台窗口,并切换到目录code/hour20。 7.执行下面的命令来运行这个Node.js应用程序。程序清单20.4显示了这个应用程序的输出。 程序清单20.3 NodejsFindFields.js:在Node.js应用程序中限制从集合返回的文档包含的字段 程序清单20.4 NodejsFindFields.js-output:在Node.js应用程序中限制从集合返回的文档包含的字段的输出 ▲

为限制文档检索时返回的数据量,另一种极有效的方式是限制要返回的字段。文档可能有很多字段在有些情况下很有用,但在其他情况下没用。从MongoDB服务器检索文档时,需考虑应包含哪些字段,并只请求必要的字段。

要对Collection对象的方法find()从服务器返回的字段进行限制,可使用参数fields。这个参数是一个JavaScript对象,它使用值true来包含字段,使用值false来排除字段。

例如,要在返回文档时排除字段stats、value和comments,可使用下面的fields参数:

var fields = {'stats' : false, 'value' : false, 'comments' : false);
var cursor = myColl.find({}, {'fields': fields});

这里将查询对象指定成了null,因为您要查找所有的文档。

仅包含所需的字段通常更容易。例如,如果只想返回first字段为t的文档的word和size字段,可使用下面的代码:

var query = {'first' : 't'};
var fields = {'word' : true, 'size' : true};
var cursor = myColl.find(query, fields);

▼ Try It Yourself

node NodejsFindFields.js
01 var MongoClient = require('mongodb').MongoClient;
02 var Server = require('mongodb').Server;
03 var mongo = new MongoClient();
04 var myDB = null;
05 mongo.connect("mongodb://localhost/", function(err, db) {
06    myDB = db.db("words");
07    myDB.collection("word_stats", function(err, collection){
08       includeFields(collection, ['word', 'size']);
09       includeFields(collection, ['word', 'letters']);
10       excludeFields(collection, ['lettes', 'stats', 'charsets']);
11       setTimeout(function(){myDB.close();}, 3000);
12    });
13 });
14 function displayCursor(doc, msg){
15    console.log("\n" + msg);
16    console.log(doc);
17 }
18 function includeFields(collection, fields){
19    var query = {'first': 'p'};
20    var fieldObj = {};
21    for (var i in fields){
22       fieldObj[fields[i]] = true;
23    }
24    collection.findOne(query, {fields: fieldObj}, function(err, doc){
25       displayCursor(doc, "Including " + fields +" fields:");
26    });
27 }
28 function excludeFields(collection, fields){
29    var query = {'first': 'p'};
30    var fieldObj = {};
31    for (var i in fields){
32       fieldObj[fields[i]] = false;
33    }
34    collection.findOne(query, {fields: fieldObj}, function(err, doc){
35       displayCursor(doc, "Excluding " + fields +" fields:");
36    });
37 }
Including word,size fields:
{ _id: 52eff3508101065e6a93e35f, word: 'people', size: 6 }
Including word,letters fields:
{ _id: 52eff3508101065e6a93e35f,
   word: 'people',
   letters: [ 'p', 'e', 'o', 'l' ] }
Excluding lettes,stats,charsets fields:
{ _id: 52eff3508101065e6a93e35f,
word: 'people',
first: 'p',
last: 'e',
size: 6,
letters: [ 'p', 'e', 'o', 'l' ] }