MongoDB 入门操作汇总,网易架构师深入讲解 Java 开发
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 条文档。
测试数据集
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
}
复合索引
评论