写点什么

MongoDB 入门操作汇总,网易架构师深入讲解 Java 开发

用户头像
极客good
关注
发布于: 刚刚

db.[collection_name].remove({"key":{$gt:num}})


类比 MySQL 中的


delete from table_name where key>num;


Scene.3


db.[collection_name].remove({"key":{$gte:num}})


类比 MySQL 中的


delete from table_name where key>=num;


mongo 中的比较运算符一览


$eq (is equal) =


$gt (greater than ) >


$gte >=


$lt (less than) <


$lte <=


$ne (not equal) !=


$in in


$nin (not in) !in


, and


$or or


用法示例


| 操作符 | 格式 | 实例 | MySQL 类比 |


| --- | --- | --- | --- |


| and | {key1 : value1, key2 : value2, …} | db.test.find( {name : “pen”, price : 10} ) | where name = “pen” and price = 10 |


| or | {or : [{key1 : value1}, {key2 : value2}, …]} | db.test.find( {or:[{name : “pen”},{price : 10}]} ) | where name = “pen” or price = 10 |


修改集合中的数据


Scene.1


db.[collection_name].update({"key":"value"},{$set:{"keyC":"valueC"}})


类比 MySQL 中的


update table_name set keyC=valueC where key=value;


Scene.2


db.[colletion_name].save(obj)


obj 是一条携带_id 的记录,如果_id 在集合中已存在,则覆盖对应记录,否则新增记录.


查找集合中的数据


Scene.1


db.[collection_name].find()


查询所有数据。以文本形式显示,以插入的先后顺序排序。


Scene.2


db.[collection_name].find().pretty()


查询所有数据,以 JSON 格式显示。


Scene.3


db.[collection_name].find({"key":"value"})


类比 MySQL


select * from table_name where key=value;


Scene.4


查询集合中前 n 条数据


db.[collection_name].find().limit(n)


Scene.5


跳过集合中前 n 条数据进行返回


db.[collection_name].find().skip(n)


Scene.6


对结果集升序排序


db.test.find().sort({"key" : 1})


类比 MySQL 中的


select * from table_name order by key asc;


对结果集降序排序则将“key”值改为-1。


三、游标


===================================================================


对集合调用 find()方法时,会获取一个游标返回。这个游标默认迭代二十次。如果将它赋值给局部变量,那么可以进行手动迭代。所以如果直接调用 find()获取结果集,那么最多只能取到 20 条文档。


3.1 游标方法的释义及示例




测试数据集


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


db.csr.find()


{ "_id" : 1, "name" : "叶秋" }


{ "_id" : 2, "name" : "吴枫" }


{ "_id" : 3, "name" : "罗淼" }


1.hasNext


判断是否有更多文档


var cursor = db.csr.find()


while (cursor.hasNext()){


... var doc = cursor.next();


... print(doc); //打印一个 BSON 对象


... printjson(doc); //解析成 JSON 格式打印


... }


[object BSON]


{ "_id" : 1, "name" : "叶秋" }


[object BSON]


{ "_id" : 2, "name" : "吴枫" }


[object BSON]


{ "_id" : 3, "name" : "罗淼" }


2.next


用来获取下一行文档


var cursor = db.csr.find()


var cursor = db.csr.find()


cursor.next()


{ "_id" : 1, "name" : "叶秋" }


cursor.next()


{ "_id" : 2, "name" : "吴枫" }


cursor.next()


{ "_id" : 3, "name" : "罗淼" }


cursor.next()


uncaught exception: Error: error hasNext: false :


DBQuery.prototype.next@src/mongo/shell/query.js:304:15


@(shell):1:1


3.toArray


将查询结果放到数组中


var cursor = db.csr.find()


var result=cursor.toArray()


print(result)


[object BSON],[object BSON],[object BSON]


printjson(result)


[


{


"_id" : 1,


"name" : "叶秋"


},


{


"_id" : 2,


"name" : "吴枫"


},


{


"_id" : 3,


"name" : "罗淼"


}


]


4.count


查询文档总数量


var cursor = db.csr.find()


print(cursor.count())


3


5.limit


限制查询结果的返回数量


db.csr.find().limit(2)


{ "_id" : 1, "name" : "叶秋" }


{ "_id" : 2, "name" : "吴枫" }


6.skip


跳过指定数目的文档


db.csr.find().skip(1)


{ "_id" : 2, "name" : "吴枫" }


{ "_id" : 3, "name" : "罗淼" }


7.sort


对查询结果进行排序


db.csr.find().sort({"_id":1})


{ "_id" : 1, "name" : "叶秋" }


{ "_id" : 2, "name" : "吴枫" }


{ "_id" : 3, "name" : "罗淼" }


db.csr.find().sort({"_id":-1})


{ "_id" : 3, "name" : "罗淼" }


{ "_id" : 2, "name" : "吴枫" }


{ "_id" : 1, "name" : "叶秋" }


8.objsLeftInBatch


查看当前批次的未被迭代的剩余文本数量


var cursor = db.csr.find()


print(cursor.objsLeftInBatch())


3


cursor.next()


{ "_id" : 1, "name" : "叶秋" }


print(cursor.objsLeftInBatch())


2


9.addOption


修改游标行为


| 参数 | 描述 |


| --- | --- |


| DBQuery.Option.tailable | 设置光标在接收到最后一个数据后不关闭,从而允许查询 continue 返回在耗尽初始结果之后添加的数据。 |


| DBQuery.Option. slaveOk | 允许查询副本从属。 |


| DBQuery.Option.noTimeout | 防止游标超时 |


| DBQuery.Option.awaitData | 将光标设置为阻塞并 await 一段时间,而不返回任何数据。一旦超时到期,光标将不返回任何数据。 |


| DBQuery.Option.exhaust | 设置游标一次性返回查询返回的所有数据,而不是将结果分成批次。 |


| DBQuery.Option.partial | 设置游标以针对某个分片群集从查询中返回部分数据,在分片群集中,某些分片不响应而是抛出错误。 |


var cursor = db.csr.find().addOption(DBQuery.Option.exhaust)


10.hint


为查询强制使用指定索引


db.csr.find().hint({_id:1})


{ "_id" : 1, "name" : "叶秋" }


{ "_id" : 2, "name" : "吴枫" }


{ "_id" : 3, "name" : "罗淼" }


11.explain


用于获取执行计划


db.test.explain().find()


{


"queryPlanner" : {


"plannerVersion" : 1,


"namespace" : "test.test",


"indexFilterSet" : false,


"parsedQuery" : {


},


"queryHash" : "8B3D4AB8",


"planCacheKey" : "8B3D4AB8",


"winningPlan" : {


"stage" : "COLLSCAN",


"direction" : "forward"


},


"rejectedPlans" : [ ]


},


"serverInfo" : {


"host" : "DESKTOP-8IVVOTG",


"port" : 27017,


"version" : "4.4.1",


"gitVersion" : "ad91a93a5a31e175f5cbf8c69561e788bbc55ce1"


},


"ok" : 1


}


12.snapshot


对查询结果使用快照。文档可能会因体积变大而被合并到文档尾部。为了使查询结果集顺序不变,可以使用快照。


经测试在 mongo4.4 中已废弃。


四、索引


===================================================================


在查询操作时,如果执行器总是扫描所有文档,那么效率将非常低下。为了解决这个问题,要用到索引。


与 MySQL 一样,MongoDB 也采用 B 树索引。索引级别从上往下依次为集合、文档字段、文档子字段。


单索引


在 key 上创建升序索引


db.[collection_name].createIndex("key":1)


在 key 上创建降序索引


db.[collection_name].createIndex("key":-1)


索引的升降序无关紧要,执行器可以在任意方向遍历索引。


示例


db.score.insertMany([{"score":80,"name":"wf"},{"score":90,"name":"timi"}])


{


"acknowledged" : true,


"insertedIds" : [


ObjectId("5fb620f9f20c8fd2914fb1b9"),


ObjectId("5fb620f9f20c8fd2914fb1ba")


]


}


db.score.createIndex({"score":1})


{


"createdCollectionAutomatically" : false,


"numIndexesBefore" : 1,


"numIndexesAfter" : 2,


"ok" : 1


}


复合索引

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
MongoDB入门操作汇总,网易架构师深入讲解Java开发