mongoose的增删改查操作
Posted lzy_tinyjoy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongoose的增删改查操作相关的知识,希望对你有一定的参考价值。
简述:
上篇博文我们简单介绍了mongoose,并熟悉了mongoose的使用流程以及相关的一些概念性的东西,那么这篇博文我们接着介绍使用Mongoose进行增删修查的操作。
案例采用的MongoDB文档结构: 下面的所有操作都将依赖上一篇博客的项目,并且新增一条age字段;Doc如下:保存数据:
Model提供了一个create方法来对数据进行保存,语法结构为:Model.create(文档数据, callback)),实例如下:userMode.create(
name: userInfo.name,
password: userInfo.password,
age: userInfo.age
, function (error, doc)
if (error)
console.error(error);
else
console.error(doc);
我们打开控制台看一下日志信息:
__v: 0,
name: 'tiny',
password: '123456',
age: 21,
_id: 587d79e1a51c535f09b8cc40
接下来我们再通过RoboMongo看一下是否已经真的写入到了数据库:
OK,这条数据已经被写入到数据库中。接下来再来看一下Mongoose的删除操作。
删除操作:
为了后续的其他操作现在再向MongoDB中插入了三条数据,如下:OK,现在我们进行删除操作:obj.remove(查询条件,callback); 示例代码如下:
//删除用户名为“tiny”的文档记录
var conditions = name: 'tiny';
userMode.remove(conditions, function (error)
if (error)
console.error(error);
else
console.error("用户删除成功")
);
//查询用户名为“tiny”的文档记录是否还存在
userMode.findOne(name: "tiny", function (error, doc)
if (error)
console.error(error)
else
console.error("删除后数据:", doc)
);
日志信息:
用户删除成功
删除后数据: null
更新数据
obj.update(查询条件,更新对象,callback);实例代码如下://更新用户名
var conditions = name: request.body.name;
var updates = $set: name: "tiny";//将用户名更新为“tiny”
userMode.update(conditions, updates, function (error)
if (error)
console.error(error);
else
console.error("更新用户名成功")
);
//查询更新后的数据
userMode.findOne(name: "tinyjoy", function (error, doc)
if (error)
console.error(error)
else
console.error("更新后数据:", doc)
);
日志信息如下:
请求体信息:
name: 'tinyjoy', password: '123456'
更新用户名成功
更新后数据: _id: 587d7b4aa51c535f09b8cc41,
name: 'tiny',
password: '1234567',
age: 14,
__v: 0
查询数据
查询操作永远是数据库操作的重中之重,因此mongoose提供操作操作的API相对其他操作也较为丰富。基本查询 :find
find基本查询: obj.find(查询条件,callback);这个查询出所有满足条件的结果值。//查询所有密码为“123456”的文档记录
userMode.find("password": userInfo.password,function (error,docs)
if (error)
console.error(error);
else
console.error("密码为123456的个数:",docs.length)
console.error("所有文档如下:\\n",docs)
);
日志信息:
密码为1234567的个数: 4
所有文档如下:
[ _id: 587d7b4aa51c535f09b8cc41,
name: 'tiny',
password: '1234567',
age: 14,
__v: 0 ,
_id: 587d7b56a51c535f09b8cc42,
name: 'tinyjoy1',
password: '1234567',
age: 18,
__v: 0 ,
_id: 587d7b71a51c535f09b8cc44,
name: 'tinyjoy3',
password: '1234567',
age: 60,
__v: 0 ,
_id: 587d7e2463260b78550e8366,
name: 'tinyjoy2',
password: '1234567',
age: 60,
__v: 0 ]
从日志可以看出查询结果返回值为满足条件的所有文档,并且返回了每个文档的所有属性字段值。那么我们可不可以根据需要过略掉不必要的字段呢?当然可以,接下来继续。
find过滤查询:
属性过滤 find(Conditions,field,callback);
//查询密码为“1234567”的所有记录,返回文档记录只包含一个键值name
userMode.find("password": userInfo.password,name:"tinyjoy",function (error,docs)
if (error)
console.error(error);
else
console.error("查询结果:",docs)
);
日志信息:
查询结果: [ _id: 587d7b4aa51c535f09b8cc41, name: 'tiny' ,
_id: 587d7b56a51c535f09b8cc42, name: 'tinyjoy1' ,
_id: 587d7b71a51c535f09b8cc44, name: 'tinyjoy3' ,
_id: 587d7e2463260b78550e8366, name: 'tinyjoy2' ]
说明:我们只需要把显示的属性设置为大于零的数就可以,当然1是最好理解的,_id是默认返回,如果不要显示加上("_id":0),但是,对其他不需要显示的属性且不是_id,如果设置为0的话将会抛异常或查询无果。
findOne:
与find相同,但只返回单个文档,也就说当查询到即一个符合条件的数据时,将停止继续查询,并返回查询结果。findOne方法,只返回第一个符合条件的文档数据。
单条数据 findOne(Conditions,callback);
//查询密码为“1234567”的一条记录
userMode.findOne("password": userInfo.password,function (error,doc)
if (error)
console.error(error);
else
console.error("查询结果:",doc)
);
日志信息:
查询结果: _id: 587d7b4aa51c535f09b8cc41,
name: 'tiny',
password: '1234567',
age: 14,
__v: 0
findById
与findOne相同,但它只接收文档的_id作为参数,返回单个文档。
单条数据 findById(_id, callback);
//查询主键为”587d7b4aa51c535f09b8cc41“的一条记录
userMode.findById('587d7b4aa51c535f09b8cc41',function (error,doc)
if (error)
console.error(error);
else
console.error("查询结果:",doc)
);
日志信息如下:
查询结果: _id: 587d7b4aa51c535f09b8cc41,
name: 'tiny',
password: '1234567',
age: 14,
__v: 0
OK,简单的find查询基本上就这么多了,但是有时候我们可能需要跟家高级的细致的查询。接下来我们一起学习一下条件查询吧。
条件查询:
通过操作符的使用,我们就可对数据进行更细致性的查询,一起来看一下吧。 "$lt"(小于),"$lte"(小于等于),"$gt"(大于),"$gte"(大于等于),"$ne"(不等于),"$in"(可单值和多个值的匹配),"$or"(查询多个键值的任意给定值),"$exists"(表示是否存在的意思)"$all"。通过一个demo熟悉一下"$lt"(小于),"$lte"(小于等于),"$gt"(大于),"$gte"(大于等于),"$ne"(不等于)的使用:
//查询年龄小于18的所有记录
userMode.find("age": "$lt": 18, function (error, doc)
if (error)
console.error(error);
else
console.error("查询结果:", doc)
);
//查询年龄小于等于18的所有记录
userMode.find("age": "$lte": 18, function (error, doc)
if (error)
console.error(error);
else
console.error("查询结果:", doc)
);
//查询年龄不等于18的所有文档记录
userMode.find("age": "$ne": 18, function (error, doc)
if (error)
console.error(error);
else
console.error("年龄不等于18的查询结果:", doc)
);
//查询年龄大于18的所有文档记录
userMode.find("age": "$gt": 18, function (error, doc)
if (error)
console.error(error);
else
console.error("年龄大于18的查询结果:", doc)
);
//查询年龄大于等于18的所有文档记录
userMode.find("age": "$gte": 18, function (error, doc)
if (error)
console.error(error);
else
console.error("年龄大于等于18的查询结果:", doc)
);
//查询年龄大于等于18小于等于60所有文档记录
userMode.find("age": "$gte": 18, "$lte": 60, function (error, doc)
if (error)
console.error(error);
else
console.error("年龄大于等于18小于等于60查询结果:", doc)
);
日志信息:
//查询年龄小于等于18的所有记录
userMode.find("age":"$lte":18,function (error,doc)
if (error)
console.error(error);
else
console.error("查询结果:",doc)
);
日志信息:
查询结果: [ _id: 587d8cd016dfd2dad509e7bb,
name: 'tiny',
password: '1234567',
age: 14,
__v: 0 ]
查询结果: [ _id: 587d8cd016dfd2dad509e7bb,
name: 'tiny',
password: '1234567',
age: 14,
__v: 0 ,
_id: 587d8cdb16dfd2dad509e7bc,
name: 'tinyjoy1',
password: '1234567',
age: 18,
__v: 0 ]
年龄不等于18的查询结果: [ _id: 587d8cd016dfd2dad509e7bb,
name: 'tiny',
password: '1234567',
age: 14,
__v: 0 ,
_id: 587d8ce516dfd2dad509e7bd,
name: 'tinyjoy2',
password: '1234567',
age: 19,
__v: 0 ,
_id: 587d8ced16dfd2dad509e7be,
name: 'tinyjoy3',
password: '1234567',
age: 25,
__v: 0 ,
_id: 587d8cf416dfd2dad509e7bf,
name: 'tinyjoy4',
password: '1234567',
age: 60,
__v: 0 ]
年龄大于18的查询结果: [ _id: 587d8ce516dfd2dad509e7bd,
name: 'tinyjoy2',
password: '1234567',
age: 19,
__v: 0 ,
_id: 587d8ced16dfd2dad509e7be,
name: 'tinyjoy3',
password: '1234567',
age: 25,
__v: 0 ,
_id: 587d8cf416dfd2dad509e7bf,
name: 'tinyjoy4',
password: '1234567',
age: 60,
__v: 0 ]
年龄大于等于18的查询结果: [ _id: 587d8cdb16dfd2dad509e7bc,
name: 'tinyjoy1',
password: '1234567',
age: 18,
__v: 0 ,
_id: 587d8ce516dfd2dad509e7bd,
name: 'tinyjoy2',
password: '1234567',
age: 19,
__v: 0 ,
_id: 587d8ced16dfd2dad509e7be,
name: 'tinyjoy3',
password: '1234567',
age: 25,
__v: 0 ,
_id: 587d8cf416dfd2dad509e7bf,
name: 'tinyjoy4',
password: '1234567',
age: 60,
__v: 0 ]
年龄大于等于18小于等于60查询结果: [ _id: 587d8cdb16dfd2dad509e7bc,
name: 'tinyjoy1',
password: '1234567',
age: 18,
__v: 0 ,
_id: 587d8ce516dfd2dad509e7bd,
name: 'tinyjoy2',
password: '1234567',
age: 19,
__v: 0 ,
_id: 587d8ced16dfd2dad509e7be,
name: 'tinyjoy3',
password: '1234567',
age: 25,
__v: 0 ,
_id: 587d8cf416dfd2dad509e7bf,
name: 'tinyjoy4',
password: '1234567',
age: 60,
__v: 0 ]
"$in"和$nin’
和$ne操作符相反,$in相当于包含、等于,查询时查找包含于指定字段条件的数据。‘$nin’ "$in" 取反, 一个键不对应指定值,具体使用方法如下://查询年龄等于18的所有记录
userMode.find(age:$in: 18,function (error,doc)
if (error)
console.error(error);
else
console.error("年龄为18的查询结果:",doc)
);
//查询年龄等于18和19的所有记录
userMode.find(age:"$in":[18,19],function (error,docs)
if (error)
console.error(error);
else
console.error("年龄为18和19的查询结果:",docs)
);
//查询年龄不等于18和19的所有记录
userMode.find(age:"$nin":[18,19],function (error,docs)
if (error)
console.error(error);
else
console.error("年龄不等于18和19的查询结果:",docs)
);
日志信息:
年龄为18的查询结果: [ _id: 587d8cdb16dfd2dad509e7bc, name: 'tinyjoy1', password: '1234567', age: 18, __v: 0 ] 年龄为18和19的查询结果: [ _id: 587d8cdb16dfd2dad509e7bc, name: 'tinyjoy1', password: '1234567', age: 18, __v: 0 , _id: 587d8ce516dfd2dad509e7bd, name: 'tinyjoy2', password: '1234567', age: 19, __v: 0 ] 年龄不等于18和19的查询结果: [ _id: 587d8cd016dfd2dad509e7bb, name: 'tiny', password: '1234567', age: 14, __v: 0 , _id: 587d8ced16dfd2dad509e7be, name: 'tinyjoy3', password: '1234567', age: 25, __v: 0 , _id: 587d8cf416dfd2dad509e7bf, name: 'tinyjoy4', password: '1234567', age: 60,
__v: 0 ,
$Or或查询:
日志信息://查询年龄等于18或者名字为tiny所有记录 userMode.find("$or": ["name": "tiny", "age": 18], function (error, docs) if (error) console.error(error); else console.error("$or查询结果:", docs) ); //查询年龄不等于18且名字不为tiny所有记录 userMode.find("$nor": ["name": "tiny", "age": 18], function (error, docs) if (error) console.error(error); else console.error("$nor查询结果:", docs) );
$or查询结果: [ _id: 587d8cd016dfd2dad509e7bb,
name: 'tiny',
password: '1234567',
age: 14,
__v: 0 ,
_id: 587d8cdb16dfd2dad509e7bc,
name: 'tinyjoy1',
password: '1234567',
age: 18,
__v: 0 ]
$nor查询结果: [ _id: 587d8ce516dfd2dad509e7bd,
name: 'tinyjoy2',
password: '1234567',
age: 19,
__v: 0 ,
_id: 587d8ced16dfd2dad509e7be,
name: 'tinyjoy3',
password: '1234567',
age: 25,
__v: 0 ,
_id: 587d8cf416dfd2dad509e7bf,
name: 'tinyjoy4',
password: '1234567',
age: 60,
__v: 0 ]
exist查询:
$exists操作符,可用于判断某些关键字段是否存在来进行条件查询。如下示例://查询所有存在name属性的文档
userMode.find(name: $exists: true, function (error, docs)
if (error)
console.error(error);
else
console.error("exists查询结果:", docs)
);
日志信息:
exists查询结果: [ _id: 587d8cd016dfd2dad509e7bb,
name: 'tiny',
password: '1234567',
age: 14,
__v: 0 ,
_id: 587d8cdb16dfd2dad509e7bc,
name: 'tinyjoy1',
password: '1234567',
age: 18,
__v: 0 ,
_id: 587d8ce516dfd2dad509e7bd,
name: 'tinyjoy2',
password: '1234567',
age: 19,
__v: 0 ,
_id: 587d8ced16dfd2dad509e7be,
name: 'tinyjoy3',
password: '1234567',
age: 25,
__v: 0 ,
_id: 587d8cf416dfd2dad509e7bf,
name: 'tinyjoy4',
password: '1234567',
age: 60,
__v: 0 ]
以上是关于mongoose的增删改查操作的主要内容,如果未能解决你的问题,请参考以下文章