mongodb 基本操作
所有操作都在 MongoDB 可视化工具 Robo 3T 软件下演示操作
一:使用 insert 插入文档:
插入一条数据与多条数据的格式:
1 db.<集合>.insertOne(<JSON对象>) 2 db.<集合>.insertMany([<JSON 1>, <JSON 2>, ...<JSON n>])
示例:
1 db.fruit.insertOne({name: "apple"}) 2 3 db.fruit.insertMany([ 4 {name: "apple"}, 5 {name: "pear"}, 6 {name: "orange"} 7 ])
Robo 3T:
单条:
多条:
二:使用 find 查询文档:
查询条件对照表:
运算符:
1 $lt :存在并小于; 2 $lte :存在并小于等于; 3 $gt :存在并大于; 4 $gte :存在并大于等于; 5 $ne :不存在或存在但不等于; 6 $in :存在并在指定数组中; 7 $nin :不存在或不在指定数组中; 8 $or :匹配两个或多个条件中的一个; 9 $and :匹配全部条件;
查询示例:
1 db.movies.find("year": 1975}) //单条件查询; 2 db.movies.find({"year": 1989, "title": "Batman"}) //多条件and查询; 3 db.movies.find({$and: [{"title": "Batman"}, {"category": "action}]}) //and查询的另一种形式; 4 db.movies.find({$or: [{"year": 1989}, {"title": "Batman"}]}) //多条件 or 查询; 5 db.movies.find({"title": /^B/}) //按正则表达式查找;
使用 find 查询子文档:
1 # 插入带有子文档的文档数据; 2 db.fruit.insertOne({ 3 name: "apple", 4 from: { 5 country: "China", 6 province: "Guangdon" 7 } 8 }) 9 10 # 查询: 11 db.fruit.find({"from.country": "China"})
Robo 3T:(上方为插入文档的命令,下方显示的数据需使用 db.getCollection('fruit').find({}) 查询才会显示结果)
查询数组中的元素(例1):
1 # 插入带数组的文档数据 2 3 db.fruit.insert([ 4 {"name": "Apple", color: ["red", "green"]}, 5 {"name": "Mango", color: ["yellow", "green"]} 6 ]) 7 8 # 查询 9 10 db.fruit.find({color: "red"}) //显示一个结果; 11 db.fruit.find({$or: [{color: "red"}, {color: "yellow"}]}) //显示两条结果;
Robo 3T:(插入的数组文档的显示格式)
查询数组中的对象(例2):
1 # 文档数组中的子文档 2 3 db.movies.insertOne({ 4 "title": "Raiders of the Lost Ark", 5 "filming_locations": [ 6 {"city": "Los Angeles", "state": "CA", "country": "USA"}, 7 {"city": "Rome", "state": "Lazio", "country": "Italy"}, 8 {"city": "Florence", "state": "SC", "country": "USA"} 9 ] 10 }) 11 12 13 # 查询城市为 Rome 的记录 14 15 db.movies.find({"filming_locations.city": "Rome"})
Robo 3T的文档显示:
查询在同一子对象中必须同时满足两个条件的文档,如下所示:
1 # 第一种方法: 2 3 db.getCollection('movices').find({ 4 "filming_locations.city": "Rome", 5 "filming_locations.country": "USA" 6 })
第二种,使用 $elemMatch 查询,它表示必须是同一子对象满足多个条件。
(子对象 city=Rome ,它的 country=Italy 而不是等于 USA ,所以查询返回的文档为空)
使用 find 返回指定字段
_id 字段必须明确指定不返回(0),否则默认返回(1);
1 # 不返回 _id,只返回 title; 2 3 db.movies.find({}, {"_id": 0, title: 1}) 4 5 # {} 表示操作所有文档,可加条件,比如只找 category=action 的文档数据; 6 db.movies.find({"category": "action"}, {"_id": 0, title: 1})
三:使用 remove 删除文档:
示例:
1 db.testcol.remove({a: 1}) //删除 a 等于 1 的文档; 2 db.testcol.remove({a: {$lt: 5}}) //删除 a 小于 5 的文档; 3 db.testcol.remove({}) //删除所有文档; 4 db.tesfcol.remove() //错误写法,报错;
四:使用 update 更新文档
格式: db.<集合>.update(<查询条件>, <更新字段>)
updateOne:表示无论条件匹配多少条记录,始终只更新第一条;
updateMany:表示条件匹配多少条就更新多少条;
两个方法在要求更新的部分中,必须加入 以下操作符中的一个,才能进行更新操作。否则会报错:
1 $set :更新的字段不存在时新增字段,存在则修改它; 2 $unset :删除字段; 3 $push :增加一个对象到数组底部; 4 $pushAll :增加多个对象到数组底部; 5 $pop :从数组底部删除一个对象; 6 $pull :如果匹配指定的值,从数组中删除相应的对象; 7 $pullAll :如果匹配任意的值,从数据中删除相应的对象; 8 $addToSet:如果不存在则增加一个值到数组;
例子:
1 # 插入多条数据; 2 db.fruit.insertMany([ 3 {name: "apple"}, 4 {name: "pear"}, 5 {name: "orange"} 6 ]) 7 8 # 根据查询条件更新文档数据; 9 db.fruit.updateOne({name: "apple"}, {$set: {from: "China"}})
Robo 3T:(通过找出 name=apple 的数据后,使用 $set 进行更新)
五:使用 drop 删除集合
格式: db.<集合>.drop()
该命令将会删除全部文档,以及删除集合相关的索引。
慎用 ! 删除整个库: db.dropDatabase() ,在当前库下运行将删除整个库。