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

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"]}]}