nodejs mongodb driver、nodejs mongodb driver api
mongod --dbpath ~/Documents/db
运行 mongodb 服务器,然后通过 mongodb shell 操作这个 mongodb 实例,进入 mongo shell 的方式是输入 mongo
;.mongorc.js
文件是 mongo 在启动时会自动执行的文件;$
是所谓的 positional operator,有三种形式,分别是 $
、$[]
、$[identifier]
,其中第三个是和 arrayFilters 一起使用的,叫做 filtered positional operator;$[]
表示数组的每一个 item,用于更新操作,文档;$
除了可以用作 update operator,还可以用作 projection operator,它表示匹配到的所有 doc 中的第一个;upsert
是一种特殊的 update,它不同于 insert;next()
或 toArray()
或 forEach
等方法获取数据的时候,cursor 才会向服务器发送请求,服务器会返回前面的 100 个 doc 或者 4MB 的 doc,当这些 doc 都用完之后,会再次向服务器发送请求,直到所有匹配到的 doc 都用完,toArray()
如果不传入函数,则返回 promise,如果传入了回调函数,那不能在前面加 await;和 mongodb 的 nodejs driver 的 api 不完全相同。
db.collection.find({},{})
第二个参数可以获取 doc 中的指定某些属性,1 表示返回,0 表示不返回,find 返回 cursor,cursor 的方法通常返回另一个 cursor,所以可以拼接在一起;db.collection.insertOne({})
,添加一个文档到数据库;const { result } = await db.collection("oppo").insertOne({ a: "b" });
db.collection.insertMany([{},{}])
,导入数据可以用 mongoimport,默认情况下 insert 顺序就是提供的 doc 顺序,可以增加 {ordered: false}
开启无序增加,无序增加不会因为某个文档出错而导致其他文档添加失败;db.collection.save({})
;db.collection.deleteOne({})
这样会匹配所有文档,但是因为是 delete one,所以会删除匹配到的第一个文档;db.collection.deleteMany({})
:这样会匹配所有文档,所以会删除所有文档,删除所有文档也可以用 db.collection.drop()
;db.collection.updateOne({}, {})
:更新 doc 中的某些属性,第二个参数通常包含所谓的 update operator,如果第一个参数是 {},则表示更新所有文档,如果需要更新的属性没有,会为文档自动添加这个属性;await db.collection("user").insertOne({ id: 1, name: "tom" });
const doc = {
id: 2,
name: "jack",
hobby: "swimming",
};
const { result: re } = await db
.collection("user")
.updateOne({ id: 2 }, { $setOnInsert: { ...doc } }, { upsert: true });
db.collection.updateMany({},{})
;db.collection.replaceOne({},{})
;db.collection.findOneAndUpdate({},{},{})
;db.collection.updateOne()
中的 operator 叫 update operator,update operator 可以分为 3 类,分别是 field operator、array update operator、bitwise update operator。
上面提到的 $inc
、$set
、$unset
、$setOnInsert
等都是 field operator,$push
、$pull
、$each
、$addToSet
、$pop
、$slice
、$sort
等都是 array update operator。bitwise operator 只有一个,就是 $bit
。
$sort
必须和 $each
一起用,如果只想 update 数组的 item 顺序,可以给 $each
提供一个空数组。
$lt
、$lte
、$gt
、$gte
、$ne
,经常用来 query date;$in
、$nin
$or
$mod
表示那个 key 的 value,除以 mod 后面的 array 第一个数字之后,得到这个 array 的第二个数字;$not
null
,可以获取所有不存在这个 key 的 doc,或者存在这个 key,但是这个 key 的值也是 null 的 doc;$regex
$all
,用于 array query$size
,用于 array query$slice
$elemMatch
意思是对 array field 中的 array 进行 query,经常用在这个 array 的 element 是 embedded doc 的情况下;The aggregation framework allows you to analyze your data in real time. Using the framework, you can create an aggregation pipeline that consists of one or more stages. Each stage transforms the documents and passes the output to the next stage.
aggregation 有三种模式,最常用的是 aggregation pipeline framework。
$match
、$project
、$count
、$sort
、$limit
、$skip
、$set
等等;$abs
、$add
、$concat
、$ceil
、$lt
、$eq
等等,有非常多;db.collection().aggregate([{},{},{},{}...])
,aggregate() 接收一个数组,数组的元素是一个一个的 stage。