mongodb基本使用
1.mongodb不是关系型数据库,而是面向文档的数据库
在mongo中,文档的键不是固定的,文档的键对应的值的数据类型也不是固定的。在mongo中,集合类似于关系型数据库中的表,文档类似于关系型数据库中的行。每个文档都有一个特殊的键‘_id’(由mongo创建),在它所属的集合中是唯一的。
2.启动mongodb
启动服务端:
mongod --dbpath <dbpath>
启动客户端:
mongo
mongodb的客户端使用的是javascript语法,可以在终端中输入Math.round(1.2),终端会返回给我们一个1
可以使用db命令查看当前使用的是哪个数据库
3.基本的curd
在mongo中使用use切换数据库
use movies
我们在终端中设置一个js变量
movie = {title:"movie title", year: 1997}
把变量插入到集合中
db.movies.insertOne(movie)
查看movies集合中的数据,在mongo中常用的读取方法有find和findOne,find用于查找所有文档,而findOne只查找第一个文档
db.movies.find()
如果想规整的查看数据,可以使用pretty方法
db.movies.find().pretty()
使用updateOne更新数据,updateOne接受两个参数,第一个是<condition>,第二个是要更新的数据,用$set标记
db.movies.updateOne({year: 1997}, {$set: {year: 1949}})
删除可以使用deleteOne和deletemany,使用deleteOne删除我们刚才更新的这条数据。
db.movies.deleteOne({year: 1949})
4.数据类型
在mongo中可以使用的数据类型和js中的一样,有字符串、数字、布尔值等。
可以使用数组
hobbies = ['play', 'eat']
在文档中使用数组
db.<collectionName>.insertOne({hobbies: hobbies})
文档的某个字段依旧是一个文档(对象)
db.<collectionName>.insertOne({address: {phoneNum: 123456, addr: 'xxx 市'}})
5.创建、更新、删除文档
插入一条数据
db.movies.insertOne({title: 'title 01', year: 2023})
删除集合
db.movies.drop()
插入多条数据,参数最外层使用’[]‘包裹,使用insertMany插入数据时,默认插入是无序的,如果希望有序,可以在第二个配置项参数中加上ordered: true。有序插入时候如果有报错会导致mongo停止后续插入,而无序插入不会。
db.movies.insertMany([{title: 'title 01', year: 2023}, {title: 'title 02', year: 2024}])
删除文档可以使用deleteOne和deleteMany,分别对应删除一个文档和多个文档
db.movies.deleteOne({_id: ObjectId('644cdf85d86f86aec1bbb6ce')})
对文档中的数字类型进行更新,使用$inc,让year累加1
db.movies.update({title: 'title 02'}, {$inc: {year: 1}})
对文档中的任意字段进行更改或者添加都可以使用$set
给movie文档添加一个’desc‘字段
db.movies.updateOne({title: 'title 02'}, {$set: {desc: '好看的'}})
有些时候我们不是想增加文档中的字段,而是想删除文档中的字段可以使用$unset,比如我现在想删除文档中的’desc‘
db.movies.updateOne({title: 'title 02'}, {$unset: {desc: true}})
针对于数组类型的操作:
$push | 对数组项进行添加,如果文档的字段不存在,那么就创建 |
|
|
$each | 对数组项同时添加多个,如果文档的字段不存在,那么就创建 |
|
|
top n | 数组只能包含n个item |
$addToSet | 防止添加重复的项 |
$pull | 删除所有的匹配项 |
update中的upsert选项可以让我们找不到与更新条件匹配的文档时,创建一个新的文档
db.movies.updateOne({title: 'title 03'}, {$set: {desc: 'desc 03'}}, {upsert: true})
6.查找
查找movies集合中year为2025的文档
db.movies.find({year: 2025})
查找movies集合中year大于2000,小于3000的文档
db.movies.find({year: {$gt: 2000, $lt: 3000}})
查找movies集合中year大于等于2000,小于等于3000的文档
db.movies.find({year: {$gte: 2000, $lte: 3000}})
对应表:
$lt | 小于 |
$lte | 小于等于 |
$gt | 大于 |
$gtl | 大于等于 |
$eq | 等于 |
$ne | 不等于 |
多个条件满足某一个使用OR查询
使用$in
db.movies.find({year: {$in: [null, 2025]}}) // 查找year为null或者2025的文档
使用$nin
db.movies.find({year: {$nin: [null]}}) // 查找year不为null的文档
对于条件中出现多个字段的情况下可以使用$or
db.movies.find({$or: [{year: 2025}, {title: 'title 03'}]}) // 查找year为2025或者title为‘title 02’的文档
使用$not取反查询
db.movies.find({year: {$not: {$eq: 2025}}})
使用$all查询数组字段
db.movies.find({keywords: {$all: ['好玩的']}})
使用$size查询满足长度的数组字段的文档
db.movies.find({keywords: {$size: 2}})
功能超级强大的$where,使用它你的逻辑灵活性可以大大提高,它允许你执行任意javascript代码(生产慎用)
db.movies.find({$where: function() {return this.year === 2025}}) // 查找year等于2025的文档
对查询进行分页
db.movies.find().limit(10) //查询集合中的前10个文档
7.索引
如果把一个集合比作一本书,那么索引就是书本的目录。如果没有索引,你想查找任何内容都需要从头到尾翻阅,如果有索引,你只需要查看索引就能知道内容的位置。
使用createIndex创建索引
db.movies.createIndex({title: 1})
使用多个索引查询,mongo会根据你创建索引的字段和你使用的查询条件选择其中用到的有索引的字段分多线程查询,看哪个索引所在的线程查询的最快返回数据
8.在node中使用mongo
都说mongo和node是绝配,那么如何在node中使用mongo呢
初始化,安装mongoose
npm init -y
npm i mongoose
在mongoose中可以定义schema,mongoose会根据schema帮我们做数据映射,让我们更好操作mongo
const mongoose = require('mongoose')
mongoose.connect('mongodb://127.0.0.1:27017/video') // 连接到mongo server
const moviesSchema = new mongoose.Schema({ // 定义movies schema
title: String,
desc: String,
keywords: [String],
year: Number
})
const moviesModel = mongoose.model('Movies', moviesSchema) //定义model
;(async () => {
try {
const data = await moviesModel.find() // 查找数据
console.log(data)
} catch {
} finally {
await mongoose.disconnect() // 关闭连接
}
})()
执行脚本,输出:
--
标签:基本,title,mongodb,year,db,movies,文档,使用,find From: https://www.cnblogs.com/xiaomactx/p/17364650.html