MongoDB使用

文档连接: link

创建表

不需要创建表的语句,当插入表的第一条语句时,会隐式的创建表。

插入一条

db.people.insertOne(
   { user_id: "bcd001", age: 45, status: "A" }
)

插入多条

db.collection.insertMany(
   [ <document 1> , <document 2>, ... ],
   {
      writeConcern: <document>,
      ordered: <boolean>
   }
)

writeConcern

如果mongodb有多个节点,这个writeConcern是说到底写几个节点再返回。写一个节点性能快,写多个节点性能慢。

test> db.people.insertOne(
...    { user_id: "bcd001", age: 45, status: "A" },
...    {
...    "writeConcern":{w:"majority",j:true,wtimeout:5000}
...     }
... )
{
  acknowledged: true,
  insertedId: ObjectId("649be01774d3e265a2c00f74")
}
参数 说明
w:"majority” 写的时候写大多数节点就返回
j:true 表示刷到磁盘之后在返回(日志为false,计算结果为true)
wtimeout:5000 快速失败(熔断)
ordered:true 多条情况下是否按顺序插入

js脚本批量新增

客户端就是一个js的控制台。

# 通过使用客户端的load()命令批量新增
# /mongodb/js/books.js是下面脚本的路径
test> load("/mongodb/js/books.js");
true
test> db.books.countDocuments();
500000
var tags = ["nosql","mongodb","document","developer","popular"];
var types = ["technology","sociality","travel","novel","literature"];
var books=[];
for(var i=0;i<500000;i++){
var typeIdx = Math.floor(Math.random()*types.length);
var tagIdx = Math.floor(Math.random()*tags.length);
var favCount = Math.floor(Math.random()*100);
var book = {
title: "book-"+i,
type: types[typeIdx],
tag: tags[tagIdx],
favCount: favCount,
author: "xxx"+i
};
books.push(book)
}
db.books.insertMany(books);

help

db.help()
db.books.help()

db.books.find()
db.books.find({tag:"nosql"})

条件查询

SQL MQL
a = 1 {a: 1}
a <> 1 {a: {$ne: 1}}
a > 1 {a: {$gt: 1}}
a >= 1 {a: {$gte: 1}}
a < 1 {a: {$lt: 1}}
a <= 1 {a: {$lte: 1}}

查询逻辑

SQL MQL
a = 1 AND b = 1 {a: 1, b: 1}或{$and: [{a: 1}, {b: 1}]}
a = 1 OR b = 1 {$or: [{a: 1}, {b: 1}]}
a IS NULL {a: {$exists: false}}
a IN (1, 2, 3) {a: {$in: [1, 2, 3]}}

正则表达式

## 使用正则表达式查找type包含 so 字符串的book
db.books.find({type:{$regex:"so"}})
## 或者
db.books.find({type:/so/})

排序

# #指定按收藏数(favCount)降序返回
db.books.find({type:"travel"}).sort({favCount:-1})

分页

db.books.find().skip(16).limit(8)

数据量非常大的情况下,避免使用分页,因为还是会扫描前多少条。

test> db.books.find({_id:{$gt: ObjectId("649be1ac74d3e265a2c00ff8")}}).limit(1)
[
  {
    _id: ObjectId("649be1ac74d3e265a2c00ff9"),
    title: 'book-132',
    type: 'literature',
    tag: 'popular',
    favCount: 97,
    author: 'xxx132'
  }
]

聚合函数

count

避免这种查询,这种也会扫描全部

# 为了计算总页数而进行的 count() 往往是拖慢页面整体加载速度的原因
db.coll.count({x: 100});

db.collection.updateOne()
db.collection.updateMany()
db.collection.updateOne(
<filter>,
<update>,
	{
		upsert: <boolean>,
		writeConcern: <document>,
		collation: <document>,
		arrayFilters: [ <filterdocument1>, ... ],
		hint: <document|string> // Available starting in MongoDB 4.2.1
	}
)

参数说明

参数
filter 一个筛选器对象,用于指定要更新的文档。只有与筛选器对象匹配的第一个文档才会被更新。
update 一个更新操作对象,用于指定如何更新文档。可以使用一些操作符,例如 s e t 、 set、 setinc、$unset等,
以更新文档中的特定字段
upsert 一个布尔值,用于指定如果找不到与筛选器匹配的文档时是否应插入一个新文档。如果upsert为true,
则会插入一个新文档。默认值为false。
writeConcern 一个文档,用于指定写入操作的安全级别。可以指定写入操作需要到达的节点数或等待写入操作的时间。
collation 一个文档,用于指定用于查询的排序规则。例如,可以通过指定locale属性来指定语言环境,从而实现基于区域设置的排序
arrayFilters 一个数组,用于指定要更新的数组元素。数组元素是通过使用更新操作符 [ ] 和 []和 []来指定的。
hint 一个文档或字符串,用于指定查询使用的索引。该参数仅在MongoDB 4.2.1及以上版本中可用。

update的操作符

操作符 格式 描述
$set {$set:{field:value}} 指定一个键并更新值,若键不存
在则创建
$unset {$unset : {field : 1 }} 删除一个键
$inc {$inc : {field : value } } 对数值类型进行增减
$rename {$rename : {old_field_name :new_field_name } } 修改字段名称
$push { $push : {field : value } } 将数值追加到数组中,若数组不存在则会进行初始化
$pushAll {$pushAll : {field : value_array}} 追加多个值到一个数组字段内
$pull {$pull : {field : _value } } 从数组中删除指定的元素
$addToSet {$addToSet : {field : value } } 添加元素到数组中,具有排重功能
$pop {$pop : {field : 1 }} 删除数组的第一个或最后一个元素
 test> db.books.find({_id:{$gt: ObjectId("649be1ac74d3e265a2c00ff8")}}).limit(1)
[
  {
    _id: ObjectId("649be1ac74d3e265a2c00ff9"),
    title: 'book-132',
    type: 'literature',
    tag: 'popular',
    favCount: 98,
    author: 'xxx132'
  }
]
test> db.books.updateOne(
... {title:"my book"},
... {$set:{tags:["nosql","mongodb"],type:"none",author:"fox"}},
... {upsert:true}
... )
{
  acknowledged: true,
  insertedId: ObjectId("649bf00ce9b03ae08c3a971e"),
  matchedCount: 0,
  modifiedCount: 0,
  upsertedCount: 1
}

更新多个

# 插入的时间统一以零时区为准,存在多个地区多个节点的情况下,如果以各自时区为准,会乱套。
db.books.updateMany({type:"novel"},{$set:{publishedDate:new Date()}})

findAndModify

先查,再返回。类似并发的getAndIncreament();返回旧值

 # 将某个book文档的收藏数(favCount)加1
db.books.findAndModify({
	query:{_id:ObjectId("642ec31813bdda928a1ea2a8")},
	update:{$inc:{favCount:1}}
})

默认情况下,findAndModify会返回修改前的“旧”数据。如果希望返回修改后的数据,则可以指定
new选项

db.books.findAndModify({
	query:{_id:ObjectId("642ec31813bdda928a1ea2a8")},
	update:{$inc:{favCount:1}},
	new:true
})

# 删除一个
db.books.deleteOne ({ type:"novel" })
# 删除集合下全部文档 ,不如直接drop性能快
db.books.deleteMany ({})
# 删除 type等于 novel 的全部文档
db.books.deleteMany ({ type:"novel" }) 

findOneAndDelete

可以实现队列,某些场景下可以实现一个队列。

db.books.findOneAndDelete({type:"novel"})

批量操作

db.pizzas.insertMany( [
{ _id: 0, type: "pepperoni", size: "small", price: 4 },
{ _id: 1, type: "cheese", size: "medium", price: 7 },
{ _id: 2, type: "vegan", size: "large", price: 8 }
] )

db.pizzas.bulkWrite( [
{ insertOne: { document: { _id: 3, type: "beef", size: "medium", price: 6 } } },
{ insertOne: { document: { _id: 4, type: "sausage", size: "large", price: 10 } }
},
{ updateOne: {
filter: { type: "cheese" },
update: { $set: { price: 8 } }
} },
{ deleteOne: { filter: { type: "pepperoni"} } },
{ replaceOne: {
filter: { type: "vegan" },
replacement: { type: "tofu", size: "small", price: 4 }
} }
] )

你可能感兴趣的:(MonoDB,mongodb,数据库)