M102: MongoDB for DBAs chapter 2学习记录
2018-03-29 14:37
423 查看
M102: MongoDB for DBAs chapter 2
运行环境
操作系统:windows 10 家庭中文版Mongodb :Mongodb 3.4
Mongodb安装路径:E:>MongoDB\Server\3.4\bin\
Mongodb存储路径:E:>MongoDB\data
课后习题
2.1题目
Download Handouts:Homework2__hw2.1_m102_529fe537e2d42347509fb412.js
Products__hw1.2_m102_529e39a8e2d42347509fb3f0.json
We will use the pcat.products collection from week 1. So start with that; if not already set up, import it:
mongoimport --drop -d pcat -c products products.json
You can find products.json from the Download Handouts link.
In the shell, go to the pcat database. If you type:
use pcat; db.products.count()
the shell should return 11.
Next, download homework2.js from the Download Handouts link. Run the shell with this script:
mongo --shell pcat homework2.js
First, make a mini-backup of the collection before we start modifying it. In the shell:
b = db.products_bak; db.products.find().forEach( function(o){ b.insert(o) } ) // check it worked: b.count() // should print 11
If you have any issues you can restore from “products_bak”; or, you can re-import with mongoimport. (You would perhaps need in that situation to empty the collection first or drop it; see the –drop option on mongoimport –help.)
In the shell, type:
homework.a()
What is the output? (The above will check that products_bak is populated.)
Enter answer here:
3.05
解答
启动我的mongod:C:\Users\Shinelon>e: E:\>MongoDB\Server\3.4\bin\mongod.exe --dbpath \MongoDB\data
按题目要求导入Products__hw1.2_m102_529e39a8e2d42347509fb3f0.json文件
C:\Users\Shinelon>e: E:\>MongoDB\Server\3.4\bin\mongoimport.exe --drop -d pcat -c products C:\Users\Shinelon\Downloads\Products__hw1.2_m102_529e39a8e2d42347509fb3f0.json 2018-03-29T11:08:46.497+0800 connected to: localhost 2018-03-29T11:08:46.552+0800 dropping: pcat.products 2018-03-29T11:08:46.640+0800 imported 11 documents
进入mongo验证导入是否正确:
E:\>MongoDB\Server\3.4\bin\mongo.exe MongoDB shell version v3.4.6 connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 3.4.6 Server has startup warnings: 2018-03-28T20:01:23.957-0700 I CONTROL [initandlisten] 2018-03-28T20:01:23.957-0700 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database. 2018-03-28T20:01:23.958-0700 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted. 2018-03-28T20:01:23.958-0700 I CONTROL [initandlisten] > use pcat switched to db pcat > db.products.count() 11 > exit bye
再按题目要求导入Homework2__hw2.1_m102_529fe537e2d42347509fb412.js脚本
E:\>MongoDB\Server\3.4\bin\mongo.exe --shell pcat C:\Users\Shinelon\Downloads\Homework2__hw2.1_m102_529fe537e2d42347509fb412.js MongoDB shell version v3.4.6 connecting to: mongodb://127.0.0.1:27017/pcat MongoDB server version: 3.4.6 type "help" for help Server has startup warnings: 2018-03-28T20:01:23.957-0700 I CONTROL [initandlisten] 2018-03-28T20:01:23.957-0700 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database. 2018-03-28T20:01:23.958-0700 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted. 2018-03-28T20:01:23.958-0700 I CONTROL [initandlisten]
验证是否成功:
> b = db.products_bak; pcat.products_bak > b.count() 11
求出第一题的答案:
> homework.a() 3.05
2.2题目
Add a new product to the products collection of this form:{ "_id" : "ac9", "name" : "AC9 Phone", "brand" : "ACME", "type" : "phone", "price" : 333, "warranty_years" : 0.25, "available" : true }
Note: in general because of the automatic line continuation in the shell, you can cut/paste in the above and shouldn’t have to type it all out. Just enclose it in the proper statement(s) to get it added.
Next, load into a shell variable the object corresponding to
_id : ObjectId("507d95d5719dbef170f15c00")
Then change term_years to 3 for that document. (And update it in the database.)
Then change over_rate for sms in limits to 0.01 from 0. Update that too.
At the shell prompt type:
homework.b()
What is the output?
Enter answer here:
0.050.019031
解答
查看整个文档数据情况:> db.products.find() { "_id" : "ac3", "name" : "AC3 Phone", "brand" : "ACME", "type" : "phone", "price" : 200, "warranty_years" : 1, "available" : true } { "_id" : "ac7", "name" : "AC7 Phone", "brand" : "ACME", "type" : "phone", "price" : 320, "warranty_years" : 1, "available" : false } { "_id" : ObjectId("507d95d5719dbef170f15c00"), "name" : "Phone Service Family Plan", "type" : "service", "monthly_price" : 90, "limits" : { "voice" : { "units" : "minutes", "n" : 1200, "over_rate" : 0.05 }, "data" : { "n" : "unlimited", "over_rate" : 0 }, "sms" : { "n" : "unlimited", "over_rate" : 0 } }, "sales_tax" : true, "term_years" : 2 } { "_id" : ObjectId("507d95d5719dbef170f15bff"), "name" : "Phone Service Core Plan", "type" : "service", "monthly_price" : 60, "limits" : { "voice" : { "units" : "minutes", "n" : 1000, "over_rate" : 0.05 }, "data" : { "n" : "unlimited", "over_rate" : 0 }, "sms" : { "n" : "unlimited", "over_rate" : 0 } }, "term_years" : 1 } { "_id" : ObjectId("507d95d5719dbef170f15bfb"), "name" : "Phone Extended Warranty", "type" : "warranty", "price" : 38, "warranty_years" : 2, "for" : [ "ac3", "ac7", "ac9", "qp7", "qp8", "qp9" ] } { "_id" : ObjectId("507d95d5719dbef170f15bf9"), "name" : "AC3 Series Charger", "type" : [ "accessory", "charger" ], "price" : 19, "warranty_years" : 0.25, "for" : [ "ac3", "ac7", "ac9" ] } { "_id" : ObjectId("507d95d5719dbef170f15c01"), "name" : "Cable TV Basic Service Package", "type" : "tv", "monthly_price" : 50, "term_years" : 2, "cancel_penalty" : 25, "sales_tax" : true, "additional_tarriffs" : [ { "kind" : "federal tarriff", "amount" : { "percent_of_service" : 0.06 } }, { "kind" : "misc tarriff", "amount" : 2.25 } ] } { "_id" : ObjectId("507d95d5719dbef170f15bfc"), "name" : "AC3 Case Black", "type" : [ "accessory", "case" ], "color" : "black", "price" : 12.5, "warranty_years" : 0.25, "available" : false, "for" : "ac3" } { "_id" : ObjectId("507d95d5719dbef170f15bfa"), "name" : "AC3 Case Green", "type" : [ "accessory", "case" ], "color" : "green", "price" : 12, "warranty_years" : 0 } { "_id" : ObjectId("507d95d5719dbef170f15bfe"), "name" : "Phone Service Basic Plan", "type" : "service", "monthly_price" : 40, "limits" : { "voice" : { "units" : "minutes", "n" : 400, "over_rate" : 0.05 }, "data" : { "units" : "gigabytes", "n" : 20, "over_rate" : 1 }, "sms" : { "units" : "texts sent", "n" : 100, "over_rate" : 0.001 } }, "term_years" : 2 } { "_id" : ObjectId("507d95d5719dbef170f15bfd"), "name" : "AC3 Case Red", "type" : [ "accessory", "case" ], "color" : "red", "price" : 12, "warranty_years" : 0.25, "available" : true, "for" : "ac3" }
按题目要求插入数据:
> abc={
... "_id" : "ac9",
... "name" : "AC9 Phone",
... "brand" : "ACME",
... "type" : "phone",
... "price" : 333,
... "warranty_years" : 0.25,
... "available" : true
... }
{ "_id" : "ac9", "name" : "AC9 Phone", "brand" : "ACME", "type" : "phone", "price" : 333, "warranty_years" : 0.25, "available" : true }
> db.products.insert(abc)
WriteResult({ "nInserted" : 1 })
验证:
> db.products.find() { "_id" : "ac3", "name" : "AC3 Phone", "brand" : "ACME", "type" : "phone", "price" : 200, "warranty_years" : 1, "available" : true } { "_id" : "ac7", "name" : "AC7 Phone", "brand" : "ACME", "type" : "phone", "price" : 320, "warranty_years" : 1, "available" : false } { "_id" : ObjectId("507d95d5719dbef170f15c e432 00"), "name" : "Phone Service Family Plan", "type" : "service", "monthly_price" : 90, "limits" : { "voice" : { "units" : "minutes", "n" : 1200, "over_rate" : 0.05 }, "data" : { "n" : "unlimited", "over_rate" : 0 }, "sms" : { "n" : "unlimited", "over_rate" : 0 } }, "sales_tax" : true, "term_years" : 2 } { "_id" : ObjectId("507d95d5719dbef170f15bff"), "name" : "Phone Service Core Plan", "type" : "service", "monthly_price" : 60, "limits" : { "voice" : { "units" : "minutes", "n" : 1000, "over_rate" : 0.05 }, "data" : { "n" : "unlimited", "over_rate" : 0 }, "sms" : { "n" : "unlimited", "over_rate" : 0 } }, "term_years" : 1 } { "_id" : ObjectId("507d95d5719dbef170f15bfb"), "name" : "Phone Extended Warranty", "type" : "warranty", "price" : 38, "warranty_years" : 2, "for" : [ "ac3", "ac7", "ac9", "qp7", "qp8", "qp9" ] } { "_id" : ObjectId("507d95d5719dbef170f15bf9"), "name" : "AC3 Series Charger", "type" : [ "accessory", "charger" ], "price" : 19, "warranty_years" : 0.25, "for" : [ "ac3", "ac7", "ac9" ] } { "_id" : ObjectId("507d95d5719dbef170f15c01"), "name" : "Cable TV Basic Service Package", "type" : "tv", "monthly_price" : 50, "term_years" : 2, "cancel_penalty" : 25, "sales_tax" : true, "additional_tarriffs" : [ { "kind" : "federal tarriff", "amount" : { "percent_of_service" : 0.06 } }, { "kind" : "misc tarriff", "amount" : 2.25 } ] } { "_id" : ObjectId("507d95d5719dbef170f15bfc"), "name" : "AC3 Case Black", "type" : [ "accessory", "case" ], "color" : "black", "price" : 12.5, "warranty_years" : 0.25, "available" : false, "for" : "ac3" } { "_id" : ObjectId("507d95d5719dbef170f15bfa"), "name" : "AC3 Case Green", "type" : [ "accessory", "case" ], "color" : "green", "price" : 12, "warranty_years" : 0 } { "_id" : ObjectId("507d95d5719dbef170f15bfe"), "name" : "Phone Service Basic Plan", "type" : "service", "monthly_price" : 40, "limits" : { "voice" : { "units" : "minutes", "n" : 400, "over_rate" : 0.05 }, "data" : { "units" : "gigabytes", "n" : 20, "over_rate" : 1 }, "sms" : { "units" : "texts sent", "n" : 100, "over_rate" : 0.001 } }, "term_years" : 2 } { "_id" : ObjectId("507d95d5719dbef170f15bfd"), "name" : "AC3 Case Red", "type" : [ "accessory", "case" ], "color" : "red", "price" : 12, "warranty_years" : 0.25, "available" : true, "for" : "ac3" } { "_id" : "ac9", "name" : "AC9 Phone", "brand" : "ACME", "type" : "phone", "price" : 333, "warranty_years" : 0.25, "available" : true }
最后一条就是新插入的那条数据
查看题目中需要修改的文档情况
> db.products.find({_id : ObjectId("507d95d5719dbef170f15c00")}) { "_id" : ObjectId("507d95d5719dbef170f15c00"), "name" : "Phone Service Family Plan", "type" : "service", "monthly_price" : 90, "limits" : { "voice" : { "units" : "minutes", "n" : 1200, "over_rate" : 0.05 }, "data" : { "n" : "unlimited", "over_rate" : 0 }, "sms" : { "n" : "unlimited", "over_rate" : 0 } }, "sales_tax" : true, "term_years" : 2 }
首先修改term_years为3
> db.products.update({_id : ObjectId("507d95d5719dbef170f15c00")}, {"$set" : {"term_years" : 3}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
验证:
> db.products.find({_id : ObjectId("507d95d5719dbef170f15c00")}) { "_id" : ObjectId("507d95d5719dbef170f15c00"), "name" : "Phone Service Family Plan", "type" : "service", "monthly_price" : 90, "limits" : { "voice" : { "units" : "minutes", "n" : 1200, "over_rate" : 0.05 }, "data" : { "n" : "unlimited", "over_rate" : 0 }, "sms" : { "n" : "unlimited", "over_rate" : 0 } }, "sales_tax" : true, "term_years" : 3 }
再修改 limits中的 sms 中的over_rate (这里有3层嵌套)
> db.products.update({_id : ObjectId("507d95d5719dbef170f15c00")}, {"$set" : {"limits.sms.over_rate" : 0.01}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
验证方法同上
求出结果:
> homework.b() 0.050.019031
2.3题目
How many products have a voice limit? (That is, have a voice field present in the limits subdocument.)Input your answer below, (just a number, no other characters).
While you can parse this one by eye, please try to use a query that will do the work of counting it for you.
Just to clarify, the answer should be a number, not a document. There should be no brackets, spaces, quotation marks, etc.
Enter answer here:
3
解答
有2种方式:第一种用exists:
> db.products.count({"limits.voice" : {"$exists" : true}}) 3
第二种用null
> db.products.count({"limits.voice" : {$ne:null}}) 3
需要注意的是exists无法使用索引,所以推荐第二种
相关文章推荐
- M102: MongoDB for DBAs chapter 2学习记录
- M102: MongoDB for DBAs chapter 1学习记录
- M102: MongoDB for DBAs chapter 2学习记录
- M102: MongoDB for DBAs chapter 1学习记录
- M102: MongoDB for DBAs chapter 2学习记录
- M102: MongoDB for DBAs chapter 1学习记录
- M102: MongoDB for DBAs chapter 2学习记录
- M102: MongoDB for DBAs chapter 1学习记录
- M102: MongoDB for DBAs chapter 2学习记录
- M102: MongoDB for DBAs chapter 1学习记录
- M102: MongoDB for DBAs chapter 2学习记录
- M102: MongoDB for DBAs chapter 1学习记录
- M102: MongoDB for DBAs chapter 2学习记录
- M102: MongoDB for DBAs chapter 1学习记录
- M102: MongoDB for DBAs chapter 2学习记录
- M102: MongoDB for DBAs chapter 1学习记录
- M102: MongoDB for DBAs chapter 2学习记录
- M102: MongoDB for DBAs chapter 1学习记录
- M102: MongoDB for DBAs chapter 2学习记录
- M102: MongoDB for DBAs chapter 1学习记录