[绍棠] mongoose的增删改查操作

保存数据:

      Model提供了一个create方法来对数据进行保存,语法结构为:Model.create(文档数据, callback)),实例如下:
[html]  view plain  copy
  1. userMode.create({  
  2.     name: userInfo.name,  
  3.     password: userInfo.password,  
  4.     age: userInfo.age  
  5. }, function (error, doc) {  
  6.     if (error) {  
  7.         console.error(error);  
  8.     } else {  
  9.         console.error(doc);       
  10.     }  
    我们打开控制台看一下日志信息:
[html]  view plain  copy
  1. { __v: 0,  
  2.   name: 'tiny',  
  3.   password: '123456',  
  4.   age: 21,  
  5.   _id: 587d79e1a51c535f09b8cc40 }  
    接下来我们再通过RoboMongo看一下是否已经真的写入到了数据库:

    OK,这条数据已经被写入到数据库中。接下来再来看一下Mongoose的删除操作。

删除操作:

   为了后续的其他操作现在再向MongoDB中插入了三条数据,如下:

    OK,现在我们进行删除操作:obj.remove(查询条件,callback);
    示例代码如下:
[html]  view plain  copy
  1. //删除用户名为“tiny”的文档记录  
  2. var conditions = {name: 'tiny'};  
  3. userMode.remove(conditions, function (error) {  
  4.     if (error) {  
  5.         console.error(error);  
  6.     } else {  
  7.         console.error("用户删除成功")  
  8.     }  
  9. });  
  10.   
  11.   
  12. //查询用户名为“tiny”的文档记录是否还存在  
  13. userMode.findOne({name: "tiny"}, function (error, doc) {  
  14.     if (error) {  
  15.         console.error(error)  
  16.     } else {  
  17.         console.error("删除后数据:", doc)  
  18.     }  
  19. });  
    日志信息:

[html]  view plain  copy
  1. 用户删除成功  
  2. 删除后数据: null  

更新数据

   obj.update(查询条件,更新对象,callback);实例代码如下:
[html]  view plain  copy
  1. //更新用户名  
  2. var conditions = {name: request.body.name};  
  3. var updates = {$set: {name: "tiny"}};//将用户名更新为“tiny”  
  4. userMode.update(conditions, updates, function (error) {  
  5.     if (error) {  
  6.         console.error(error);  
  7.     } else {  
  8.         console.error("更新用户名成功")  
  9.     }  
  10. });  
  11. //查询更新后的数据  
  12. userMode.findOne({name: "tinyjoy"}, function (error, doc) {  
  13.     if (error) {  
  14.         console.error(error)  
  15.     } else {  
  16.         console.error("更新后数据:", doc)  
  17.     }  
  18. });  
    日志信息如下:
[html]  view plain  copy
  1. 请求体信息:  
  2.  { name: 'tinyjoy', password: '123456' }  
  3. 更新用户名成功  
  4. 更新后数据: { _id: 587d7b4aa51c535f09b8cc41,  
  5.   name: 'tiny',  
  6.   password: '1234567',  
  7.   age: 14,  
  8.   __v: 0 }  

查询数据

    查询操作永远是数据库操作的重中之重,因此mongoose提供操作操作的API相对其他操作也较为丰富。

    基本查询 :find

       find基本查询: obj.find(查询条件,callback);这个查询出所有满足条件的结果值。
     
[html]  view plain  copy
  1. //查询所有密码为“123456”的文档记录  
  2. userMode.find({"password": userInfo.password},function (error,docs) {  
  3.     if (error){  
  4.         console.error(error);  
  5.     }else{  
  6.         console.error("密码为123456的个数:",docs.length)  
  7.         console.error("所有文档如下:\n",docs)  
  8.     }  
  9. });  
    日志信息:
[html]  view plain  copy
  1. 密码为1234567的个数: 4  
  2. 所有文档如下:  
  3.  [ { _id: 587d7b4aa51c535f09b8cc41,  
  4.     name: 'tiny',  
  5.     password: '1234567',  
  6.     age: 14,  
  7.     __v: 0 },  
  8.   { _id: 587d7b56a51c535f09b8cc42,  
  9.     name: 'tinyjoy1',  
  10.     password: '1234567',  
  11.     age: 18,  
  12.     __v: 0 },  
  13.   { _id: 587d7b71a51c535f09b8cc44,  
  14.     name: 'tinyjoy3',  
  15.     password: '1234567',  
  16.     age: 60,  
  17.     __v: 0 },  
  18.   { _id: 587d7e2463260b78550e8366,  
  19.     name: 'tinyjoy2',  
  20.     password: '1234567',  
  21.     age: 60,  
  22.     __v: 0 } ]  
    从日志可以看出查询结果返回值为满足条件的所有文档,并且返回了每个文档的所有属性字段值。那么我们可不可以根据需要过略掉不必要的字段呢?当然可以,接下来继续。
 find过滤查询:
    属性过滤 find(Conditions,field,callback);
[html]  view plain  copy
  1. //查询密码为“1234567”的所有记录,返回文档记录只包含一个键值name  
  2. userMode.find({"password": userInfo.password},{name:"tinyjoy"},function (error,docs) {  
  3.     if (error){  
  4.         console.error(error);  
  5.     }else{  
  6.         console.error("查询结果:",docs)  
  7.     }  
  8. });  
    日志信息:
[html]  view plain  copy
  1. 查询结果: [ { _id: 587d7b4aa51c535f09b8cc41, name: 'tiny' },  
  2.   { _id: 587d7b56a51c535f09b8cc42, name: 'tinyjoy1' },  
  3.   { _id: 587d7b71a51c535f09b8cc44, name: 'tinyjoy3' },  
  4.   { _id: 587d7e2463260b78550e8366, name: 'tinyjoy2' } ]  
    说明:我们只需要把显示的属性设置为大于零的数就可以,当然1是最好理解的,_id是默认返回,如果不要显示加上("_id":0),但是,对其他不需要显示的属性且不是_id,如果设置为0的话将会抛异常或查询无果。
     findOne:
        与find相同,但只返回单个文档,也就说当查询到即一个符合条件的数据时,将停止继续查询,并返回查询结果。findOne方法,只返回第一个符合条件的文档数据。
        单条数据 findOne(Conditions,callback);
[html]  view plain  copy
  1. //查询密码为“1234567”的一条记录  
  2. userMode.findOne({"password": userInfo.password},function (error,doc) {  
  3.     if (error){  
  4.         console.error(error);  
  5.     }else{  
  6.         console.error("查询结果:",doc)  
  7.     }  
  8. });  
日志信息:
[html]  view plain  copy
  1. 查询结果: { _id: 587d7b4aa51c535f09b8cc41,  
  2.   name: 'tiny',  
  3.   password: '1234567',  
  4.   age: 14,  
  5.   __v: 0 }  
findById
    与findOne相同,但它只接收文档的_id作为参数,返回单个文档。
    单条数据 findById(_id, callback);
[html]  view plain  copy
  1. //查询主键为”587d7b4aa51c535f09b8cc41“的一条记录  
  2. userMode.findById('587d7b4aa51c535f09b8cc41',function (error,doc) {  
  3.     if (error){  
  4.         console.error(error);  
  5.     }else{  
  6.         console.error("查询结果:",doc)  
  7.     }  
  8. });  
    日志信息如下:
[html]  view plain  copy
  1. 查询结果: { _id: 587d7b4aa51c535f09b8cc41,  
  2.   name: 'tiny',  
  3.   password: '1234567',  
  4.   age: 14,  
  5.   __v: 0 }  
    OK,简单的find查询基本上就这么多了,但是有时候我们可能需要跟家高级的细致的查询。接下来我们一起学习一下条件查询吧。

条件查询:

通过操作符的使用,我们就可对数据进行更细致性的查询,一起来看一下吧。
"$lt"(小于),"$lte"(小于等于),"$gt"(大于),"$gte"(大于等于),"$ne"(不等于),"$in"(可单值和多个值的匹配),"$or"(查询多个键值的任意给定值),"$exists"(表示是否存在的意思)"$all"。

通过一个demo熟悉一下"$lt"(小于),"$lte"(小于等于),"$gt"(大于),"$gte"(大于等于),"$ne"(不等于)的使用:
[html]  view plain  copy
  1. //查询年龄小于18的所有记录  
  2. userMode.find({"age": {"$lt": 18}}, function (error, doc) {  
  3.     if (error) {  
  4.         console.error(error);  
  5.     } else {  
  6.         console.error("查询结果:", doc)  
  7.     }  
  8. });  
  9. //查询年龄小于等于18的所有记录  
  10. userMode.find({"age": {"$lte": 18}}, function (error, doc) {  
  11.     if (error) {  
  12.         console.error(error);  
  13.     } else {  
  14.         console.error("查询结果:", doc)  
  15.     }  
  16. });  
  17. //查询年龄不等于18的所有文档记录  
  18. userMode.find({"age": {"$ne": 18}}, function (error, doc) {  
  19.     if (error) {  
  20.         console.error(error);  
  21.     } else {  
  22.         console.error("年龄不等于18的查询结果:", doc)  
  23.     }  
  24. });  
  25. //查询年龄大于18的所有文档记录  
  26. userMode.find({"age": {"$gt": 18}}, function (error, doc) {  
  27.     if (error) {  
  28.         console.error(error);  
  29.     } else {  
  30.         console.error("年龄大于18的查询结果:", doc)  
  31.     }  
  32. });  
  33. //查询年龄大于等于18的所有文档记录  
  34. userMode.find({"age": {"$gte": 18}}, function (error, doc) {  
  35.     if (error) {  
  36.         console.error(error);  
  37.     } else {  
  38.         console.error("年龄大于等于18的查询结果:", doc)  
  39.     }  
  40. });  
  41. //查询年龄大于等于18小于等于60所有文档记录  
  42. userMode.find({"age": {"$gte": 18, "$lte": 60}}, function (error, doc) {  
  43.     if (error) {  
  44.         console.error(error);  
  45.     } else {  
  46.         console.error("年龄大于等于18小于等于60查询结果:", doc)  
  47.     }  
  48. });  
日志信息:
[html]  view plain  copy
  1. //查询年龄小于等于18的所有记录  
  2. userMode.find({"age":{"$lte":18}},function (error,doc) {  
  3.     if (error){  
  4.         console.error(error);  
  5.     }else{  
  6.         console.error("查询结果:",doc)  
  7.     }  
  8. });  
  9.   
  10. 日志信息:  
  11.   
  12. 查询结果: [ { _id: 587d8cd016dfd2dad509e7bb,  
  13.     name: 'tiny',  
  14.     password: '1234567',  
  15.     age: 14,  
  16.     __v: 0 } ]  
  17. 查询结果: [ { _id: 587d8cd016dfd2dad509e7bb,  
  18.     name: 'tiny',  
  19.     password: '1234567',  
  20.     age: 14,  
  21.     __v: 0 },  
  22.   { _id: 587d8cdb16dfd2dad509e7bc,  
  23.     name: 'tinyjoy1',  
  24.     password: '1234567',  
  25.     age: 18,  
  26.     __v: 0 } ]  
  27. 年龄不等于18的查询结果: [ { _id: 587d8cd016dfd2dad509e7bb,  
  28.     name: 'tiny',  
  29.     password: '1234567',  
  30.     age: 14,  
  31.     __v: 0 },  
  32.   { _id: 587d8ce516dfd2dad509e7bd,  
  33.     name: 'tinyjoy2',  
  34.     password: '1234567',  
  35.     age: 19,  
  36.     __v: 0 },  
  37.   { _id: 587d8ced16dfd2dad509e7be,  
  38.     name: 'tinyjoy3',  
  39.     password: '1234567',  
  40.     age: 25,  
  41.     __v: 0 },  
  42.   { _id: 587d8cf416dfd2dad509e7bf,  
  43.     name: 'tinyjoy4',  
  44.     password: '1234567',  
  45.     age: 60,  
  46.     __v: 0 } ]  
  47. 年龄大于18的查询结果: [ { _id: 587d8ce516dfd2dad509e7bd,  
  48.     name: 'tinyjoy2',  
  49.     password: '1234567',  
  50.     age: 19,  
  51.     __v: 0 },  
  52.   { _id: 587d8ced16dfd2dad509e7be,  
  53.     name: 'tinyjoy3',  
  54.     password: '1234567',  
  55.     age: 25,  
  56.     __v: 0 },  
  57.   { _id: 587d8cf416dfd2dad509e7bf,  
  58.     name: 'tinyjoy4',  
  59.     password: '1234567',  
  60.     age: 60,  
  61.     __v: 0 } ]  
  62. 年龄大于等于18的查询结果: [ { _id: 587d8cdb16dfd2dad509e7bc,  
  63.     name: 'tinyjoy1',  
  64.     password: '1234567',  
  65.     age: 18,  
  66.     __v: 0 },  
  67.   { _id: 587d8ce516dfd2dad509e7bd,  
  68.     name: 'tinyjoy2',  
  69.     password: '1234567',  
  70.     age: 19,  
  71.     __v: 0 },  
  72.   { _id: 587d8ced16dfd2dad509e7be,  
  73.     name: 'tinyjoy3',  
  74.     password: '1234567',  
  75.     age: 25,  
  76.     __v: 0 },  
  77.   { _id: 587d8cf416dfd2dad509e7bf,  
  78.     name: 'tinyjoy4',  
  79.     password: '1234567',  
  80.     age: 60,  
  81.     __v: 0 } ]  
  82. 年龄大于等于18小于等于60查询结果: [ { _id: 587d8cdb16dfd2dad509e7bc,  
  83.     name: 'tinyjoy1',  
  84.     password: '1234567',  
  85.     age: 18,  
  86.     __v: 0 },  
  87.   { _id: 587d8ce516dfd2dad509e7bd,  
  88.     name: 'tinyjoy2',  
  89.     password: '1234567',  
  90.     age: 19,  
  91.     __v: 0 },  
  92.   { _id: 587d8ced16dfd2dad509e7be,  
  93.     name: 'tinyjoy3',  
  94.     password: '1234567',  
  95.     age: 25,  
  96.     __v: 0 },  
  97.   { _id: 587d8cf416dfd2dad509e7bf,  
  98.     name: 'tinyjoy4',  
  99.     password: '1234567',  
  100.     age: 60,  
  101.     __v: 0 } ]  

"$in"和$nin’

    和$ne操作符相反,$in相当于包含、等于,查询时查找包含于指定字段条件的数据。‘$nin’ "$in" 取反, 一个键不对应指定值,具体使用方法如下:
[html]  view plain  copy
  1. //查询年龄等于18的所有记录  
  2. userMode.find({age:{$in: 18}},function (error,doc) {  
  3.     if (error){  
  4.         console.error(error);  
  5.     }else{  
  6.         console.error("年龄为18的查询结果:",doc)  
  7.     }  
  8. });  
  9.   
  10. //查询年龄等于18和19的所有记录  
  11. userMode.find({age:{"$in":[18,19]}},function (error,docs) {  
  12.     if (error){  
  13.         console.error(error);  
  14.     }else{  
  15.         console.error("年龄为18和19的查询结果:",docs)  
  16.     }  
  17. });  
  18.   
  19. //查询年龄不等于18和19的所有记录  
  20. userMode.find({age:{"$nin":[18,19]}},function (error,docs) {  
  21.     if (error){  
  22.         console.error(error);  
  23.     }else{  
  24.         console.error("年龄不等于18和19的查询结果:",docs)  
  25.     }  
  26. });  
    日志信息:
[html]  view plain  copy
  1. 年龄为18的查询结果: [ { _id: 587d8cdb16dfd2dad509e7bc,  
  2.     name: 'tinyjoy1',  
  3.     password: '1234567',  
  4.     age: 18,  
  5.     __v: 0 } ]  
  6. 年龄为18和19的查询结果: [ { _id: 587d8cdb16dfd2dad509e7bc,  
  7.     name: 'tinyjoy1',  
  8.     password: '1234567',  
  9.     age: 18,  
  10.     __v: 0 },  
  11.   { _id: 587d8ce516dfd2dad509e7bd,  
  12.     name: 'tinyjoy2',  
  13.     password: '1234567',  
  14.     age: 19,  
  15.     __v: 0 } ]  
  16. 年龄不等于18和19的查询结果: [ { _id: 587d8cd016dfd2dad509e7bb,  
  17.     name: 'tiny',  
  18.     password: '1234567',  
  19.     age: 14,  
  20.     __v: 0 },  
  21.   { _id: 587d8ced16dfd2dad509e7be,  
  22.     name: 'tinyjoy3',  
  23.     password: '1234567',  
  24.     age: 25,  
  25.     __v: 0 },  
  26.   { _id: 587d8cf416dfd2dad509e7bf,  
  27.     name: 'tinyjoy4',  
  28.     password: '1234567',  
  29.     age: 60,  
[html]  view plain  copy
  1. __v: 0 },  

$Or或查询:

 
     
[html]  view plain  copy
  1. //查询年龄等于18或者名字为tiny所有记录  
  2. userMode.find({"$or": [{"name": "tiny"}, {"age": 18}]}, function (error, docs) {  
  3.     if (error) {  
  4.         console.error(error);  
  5.     } else {  
  6.         console.error("$or查询结果:", docs)  
  7.     }  
  8. });  
  9.   
  10. //查询年龄不等于18且名字不为tiny所有记录  
  11. userMode.find({"$nor": [{"name": "tiny"}, {"age": 18}]}, function (error, docs) {  
  12.     if (error) {  
  13.         console.error(error);  
  14.     } else {  
  15.         console.error("$nor查询结果:", docs)  
  16.     }  
  17. });  
   日志信息:
 
    
[html]  view plain  copy
  1. $or查询结果: [ { _id: 587d8cd016dfd2dad509e7bb,  
  2.     name: 'tiny',  
  3.     password: '1234567',  
  4.     age: 14,  
  5.     __v: 0 },  
  6.   { _id: 587d8cdb16dfd2dad509e7bc,  
  7.     name: 'tinyjoy1',  
  8.     password: '1234567',  
  9.     age: 18,  
  10.     __v: 0 } ]  
  11. $nor查询结果: [ { _id: 587d8ce516dfd2dad509e7bd,  
  12.     name: 'tinyjoy2',  
  13.     password: '1234567',  
  14.     age: 19,  
  15.     __v: 0 },  
  16.   { _id: 587d8ced16dfd2dad509e7be,  
  17.     name: 'tinyjoy3',  
  18.     password: '1234567',  
  19.     age: 25,  
  20.     __v: 0 },  
  21.   { _id: 587d8cf416dfd2dad509e7bf,  
  22.     name: 'tinyjoy4',  
  23.     password: '1234567',  
  24.     age: 60,  
  25.     __v: 0 } ]  

exist查询:

    $exists操作符,可用于判断某些关键字段是否存在来进行条件查询。如下示例:
[html]  view plain  copy
  1. //查询所有存在name属性的文档  
  2. userMode.find({name: {$exists: true}}, function (error, docs) {  
  3.     if (error) {  
  4.         console.error(error);  
  5.     } else {  
  6.         console.error("exists查询结果:", docs)  
  7.     }  
  8. });  
    日志信息:
[html]  view plain  copy
  1. exists查询结果: [ { _id: 587d8cd016dfd2dad509e7bb,  
  2.     name: 'tiny',  
  3.     password: '1234567',  
  4.     age: 14,  
  5.     __v: 0 },  
  6.   { _id: 587d8cdb16dfd2dad509e7bc,  
  7.     name: 'tinyjoy1',  
  8.     password: '1234567',  
  9.     age: 18,  
  10.     __v: 0 },  
  11.   { _id: 587d8ce516dfd2dad509e7bd,  
  12.     name: 'tinyjoy2',  
  13.     password: '1234567',  
  14.     age: 19,  
  15.     __v: 0 },  
  16.   { _id: 587d8ced16dfd2dad509e7be,  
  17.     name: 'tinyjoy3',  
  18.     password: '1234567',  
  19.     age: 25,  
  20.     __v: 0 },  
  21.   { _id: 587d8cf416dfd2dad509e7bf,  
  22.     name: 'tinyjoy4',  
  23.     password: '1234567',  
  24.     age: 60,  
  25.     __v: 0 } ]  


猜你喜欢

转载自blog.csdn.net/happyshaotang2/article/details/80450116