04-从集合中获取文档
6.3 从集合中获取文档
在MongoDB shell中查找单个文档 在本节中,您将编写一个简单的MongoDB shell脚本,它从前一章创建的示例数据集中检索一个文档。这让您有机会使用findOne(),并查看返回的文档。 为编写这个在数据库words中查找一个文档的脚本,请执行如下步骤。 1.确保启动了MongoDB服务器。 2.确保运行了生成数据库words的脚本文件code/hour05/generate_words.js。 3.在文件夹code/hour06中新建一个文件,并将其命名为find_one.js。 4.在这个文件中输入程序清单6.1所示的代码。这些代码连接到数据库words,获取表示集合word_stats的Collection对象,并使用findOne()检索一个文档。 5.将这个文件存盘。 6.打开一个控制台窗口,并切换到目录code/hour06。 7.执行下面的命令来运行这个脚本,它将查询集合word_stats并检索一个文档。程序清单6.2显示了这个脚本的输出。请注意返回的文档的结构;在接下来的几节中,您将使用查询运算符来查找文档,而了解文档的结构对此很有帮助。 程序清单6.1 find_one.js:使用MongoDB shell在集合中查找单个文档 程序清单6.2 find_one.js-output:使用MongoDB shell在集合中查找单个文档的输出 ▲
在MongoDB shell中查找多个文档 在本节中,您将编写一个简单的MongoDB shell脚本,它从数据库words中检索多个文档,您还将学习如何处理find()返回的Cursor对象。在这个示例中,对Cursor对象调用了方法forEach()和map(),从而以不同的方式处理多个文档。 在程序清单程序清单6.3中,注意到第6行使用了forEach()来打印每个文档的word字段。这演示了如何迭代文档并访问每个文档的字段。 另外,在程序清单6.3中,注意到调用了方法map()来创建一个数组,其中包含所有文档的word字段。这演示了如何将结果集映射为应用程序更容易使用的结果集。 除方法forEach()和map()外,还调用了方法toArray(),如第17行所示。这个方法将游标转换为一个对象数组;然后,显示了该数组的第56个元素: 接下来,第21行调用了方法next()来获取下一个文档,然后显示这个文档。 为编写这个在数据库words中查找多个文档的脚本,请执行如下步骤。 1.确保启动了MongoDB服务器。 2.确保运行了生成数据库words的脚本文件code/hour05/generate_words.js。 3.在文件夹code/hour06中新建一个文件,并将其命名为find_all.js。 4.在这个文件中输入程序清单程序清单6.3所示的代码。这些代码连接到数据库words,获取表示集合word_stats的Collection对象,并使用find()检索该集合中的所有文档。 5.将这个文件存盘。 6.打开一个控制台窗口,并切换到目录code/hour06。 7.执行下面的命令以运行这个脚本,它将查询集合word_stats并返回一个Cursor对象,再以多种方式使用这个Cursor对象来访问文档。程序清单6.4显示了这个脚本的输出。 程序清单6.3 find_all.js:在MongoDB shell中查找并访问集合中的多个文档 程序清单6.4 find_all.js-output:在MongoDB shell中查找并访问集合中多个文档的输出 ▲
最常见的MongoDB数据库操作之一是检索一个或多个文档。例如,来看电子商务网站存储的商品信息,这些信息只存储一次,但被检索很多次。
数据检索好像很简单,但需要过滤、排序、显示和聚合结果时,可能变得非常复杂。这些复杂的数据检索将在下一章专门介绍。
接下来的几小节介绍Collection对象的方法find()和findOne()的基本知识,并演示如何使用它们来访问集合中的文档。
来看find()和findOne()的语法:
06 cursor.forEach(function(word){
07 print("word: " + word.word);
08 });
findOne(query, projection)
find(query, projection)
find()和findOne()的第一个参数都是一个query对象,该对象包含查询运算符,指定了文档的字段需要满足的条件。结果集只包含与查询条件匹配的文档。参数projection是一个这样的对象,即指定返回的文档应包含哪些字段。
11 words = cursor.map(function(word){
12 return word.word;
13 });
方法find()和findOne()的差别在于,find()返回一个find()Cursor对象,表示与查询条件匹配的文档,而findOne返回与查询条件匹配的第一个文档。
▼ Try It Yourself
17 words = cursor.toArray();
18 print(JSON.stringify(words[55]));
21 word = cursor.next();
22 print(JSON.stringify(word));
▼ Try It Yourself
mongo find_one.js
01 mongo = new Mongo("localhost");
02 wordsDB = mongo.getDB("words");
03 wordsColl = wordsDB.getCollection("word_stats");
04 word = wordsColl.findOne();
05 print("Single Document");
06 printjson(word);
Single Document:
{
"_id" : ObjectId("52d87454483398c8f2429277"),
"word" : "the",
"first" : "t",
"last" : "e",
"size" : 3,
"letters" : [
"t",
"h",
"e"
],
"stats" : {
"vowels" : 1,
"consonants" : 2
},
"charsets" : [
{
"type" : "consonants",
"chars" : [
"t",
"h"
]
},
{
"type" : "vowels",
"chars" : [
"e"
]
}
]
}
mongo find_all.js
01 mongo = new Mongo("localhost");
02 wordsDB = mongo.getDB("words");
03 wordsColl = wordsDB.getCollection("word_stats");
04 print("\nFor Each List: ");
05 cursor = wordsColl.find();
06 cursor.forEach(function(word){
07 print("word: " + word.word);
08 });
09 print("\nMapped Array: ");
10 cursor = wordsColl.find();
11 words = cursor.map(function(word){
12 return word.word;
13 });
14 printjson(words);
15 print("\nIndexed Docuemnt in Array: ");
16 cursor = wordsColl.find();
17 words = cursor.toArray();
18 print(JSON.stringify(words[55]));
19 print("\nNext Document in Cursor: ");
20 cursor = wordsColl.find();
21 word = cursor.next();
22 print(JSON.stringify(word));
For Each List:
word: the
word: be
word: and
...
word: apology
word: till
Mapped Array:
[
"the",
"be",
"and",
...
"apology",
"till"
]
Indexed Docuemnt in Array:
{"_id":{"str":"52d87454483398c8f24292ae"},"word":"there","first":"t",
"last":"e",
"size":5,"letters":["t","h","e","r"],"stats":{"vowels":2,"consonants":3},
"charsets":[{"type":"consonants","chars":["t","h","r"]},
{"type":"vowels","chars":["e"]}]}
Next Document in Cursor:
{"_id":{"str":"52d87454483398c8f2429277"},"word":"the","first":"t",
"last":"e",
"size":3,"letters":["t","h","e"],"stats":{"vowels":1,"consonants":2},
"charsets":[{"type":"consonants","chars":["t","h"]},{"type":"vowels",
"chars":[
"e"]}]}