准备工作,创建Schema约束对象和连接数据库。
//这里没有使用es6的import导入语法,因为没准备好环境,所以用了Node的require。
const mongoose = require('mongoose')
const Schema = mongoose.Schema
mongoose.connect('mongodb://127.0.0.1:27017/mytest', {useNewUrlParser: true, useUnifiedTopology: true})
mongoose.connection.once("open", () => {
console.log(`数据库已连接成功,Server is running at:http://127.0.0.1:27017`)
})
//创建一个Schema对象
const stuSchema = new Schema({
name: String,
age: Number,
gender: {
type: String,
default: "female"
},
address: String
});
const stuModel = mongoose.model('students', stuSchema);
有了Model,我们就可以对数据库进行增删改查的操作了。
create()方法,创建文档。
Model.create(doc(s),[callback])
- 含义:用来创建一个或者多个文档并添加到数据库当中。
- 参数:
第一个参数doc(s) ,后面的s代表是复数多个的意思,证明这个位置可以传一个文档对象,也可以传多个文档对象的数组。
第二个参数[callback],这个位置返回的是一个回调函数,当操作完成后,调用该函数。 - create方法模板:
stuModel.create([], err => {
if (!err) {
console.log("文档插入成功")
}
})
- 如果安装了脚手架或者有babel转译环境,可以使用ES6语法,添加一个await关键字,await后面接表达式。
await stuModel.create([], err => {
if (!err) {
console.log("文档插入成功")
}
})
- 在[]填充我们的文档对象。
stuModel.create([
{
name: "小明",
age: 22,
gender: "male",
address: "广东深圳"
},
{
name: "小红",
age: 20,
gender: "female",
address: "广东东莞"
}
], err => {
if (!err) {
console.log("文档插入成功")
}
})
-
通过node环境运行我们的js代码。
-
打开数据库可视化工具查看数据有没有插入成功。
find()方法,查询文档。
Model.find(conditions, [projection], [options], [callback])
- 查询所有符合条件的文档,总会返回一个数组。
- 参数:
第一个参数conditions:查询的条件。
第二个参数[projection]:投影,需要获取到的字段,即你想要显示多少个字段,是全部显示呢?还是过滤掉一些字段(属性)。
第三个参数[options]: 查询的选项(例如常用的skip和limit)。
第四个参数[callback](必选): 回调函数,查询结果会通过回调函数返回,如果不传回调函数,压根不会查询。 - find方法模板。
stuModel.find({name: "小红"}, (err, docs) => {
if (!err) {
console.log(docs)
}
})
-
node环境运行代码。
-
如果我们向访问具体的属性值,可以通过数组索引值访问。
-
如果第一个参数的查询条件为一个空对象(什么都不指定),即默认查询所有文档。
- 第二个参数[projection]的使用,规定显示要查询的字段(属性),将其他的字段过滤掉,它有2种传递方式,一种是传统的对象形式传递,另一种是字符串传递形式。
比如我们下面的这个例子(使用对象形式传递),只想显示_id属性字段和age属性字段,其他的通通过滤掉。
node环境执行代码,查看。
-
第二个参数[projection]的使用不一定需要写成对象的形式,它还可以使用字符串的写法。
我们发现,使用字符串的写法,无论_id属性到底有没有指定,最终它它都会默认指定(这个和MongoDB原理有个),但是我们真的想过滤掉_id属性呢?这个也是有法子的,_id属性前面添加一个减号即可去除默认指定。
-
第三个参数[options]: 查询选项的使用。
这样一看,好像看不出有什么效果。我们需要通过可视化工具打开我们的数据库查看一下,第三个参数到底要表达什么意思。
Model.findOne(conditions, [projection], [options], [callback])
- 查询符合条件的第一个(首个)文档,总会返回一个具体的文档对象,所以我们可以使用对象的形式获取属性值。
- findOne方法模板。
stuModel.findOne({}, (err, doc) => {
if (!err) {
console.log(doc)
}
})
-
findOne方法返回的是一个对象,find()方法返回的是一个数组。
Model.findById(id, [options], [callback])
- 根据文档的_id属性查询文档。
- findById()方法模板。
stuModel.findById("5f9cf5e1fca4ed20a4b81663", (err, doc) => {
if (!err) {
console.log(doc)
}
})
-
找到对应的_id,原来是小明的。
小结:通过find()查询的结果,返回的对象就是Document,即文档对象,所以我们可得出一个结论,Document对象是Model的实例,为了验证我们的结论,可以使用instanceof方法来判断一下,而typeof 是判断参数是什么类型的实例。
update()方法,修改文档。
Model.update(conditions, doc, [options], [callback])
- 用来修改一个或者多个文档。
- 参数:
conditions:查询条件
doc: 修改后的文档对象
options: 配置参数选项
callback: 回调函数
Model.updateOne(conditions, doc, [options], [callback])
- 用来修改一个文档。
-
代码如下:
-
打开数据库查看
Model.updateMany(conditions, doc, [options], [callback])
- 用来修改多个文档。
Model.replaceOne(conditions, doc, [options], [callback])
- 用来替换一个文档。
remove()和delete()方法,删除文档。
以下方法大同小异
Model.remove(conditions, [callback])
stuModel.remove({name: "小白"}, (err, doc) => {
if (!err) {
console.log('文档删除成功')
}
})
-
测试了下,remove方法已经被deprecated(废弃)了,不过还是可以用的,官方建议我们使用delete()方法。
-
查看一下,名字叫小白的文档已经被删除了。
Model.deleteOne(conditions, [callback])
Model.deleteMany(conditions, [callback])
count()方法,统计文档数量。
Model.count(conditions, [callback])
- 好吧!count()方法又被废弃了,虽然效果可以实现,返回结果:5个。
我们尝试使用官网推荐的方法.
Model.countDocuments(conditions, [callback])
stuModel.countDocuments({}, (err, count) => {
if (!err) {
console.log(count)
}
})
Model.estimatedDocumentCount(conditions, [callback])
stuModel.estimatedDocumentCount({}, (err, count) => {
if (!err) {
console.log(count)
}
})
附:官网Model具体方法链接:https://mongoosejs.com/docs/api/model.html