mongoose的增删改查

保存数据:
      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 } ]
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mongoose是一个用于在Node.js中操作MongoDB的库。它提供了一种简单而优雅的方式来定义模型和进行数据库操作。下面是使用Mongoose进行增删改查的示例代码: 1. 增加数据: ```javascript const User = require('./models/user'); // 引入模型 const newUser = new User({ user: 'John', age: 25, inter: { field: 'value' } }); newUser.save((err, savedUser) => { if (err) { console.error(err); } else { console.log('用户已保存:', savedUser); } }); ``` 2. 查询数据: ```javascript const User = require('./models/user'); // 引入模型 User.find({}, (err, users) => { if (err) { console.error(err); } else { console.log('所有用户:', users); } }); ``` 3. 更新数据: ```javascript const User = require('./models/user'); // 引入模型 User.findOneAndUpdate({ user: 'John' }, { age: 30 }, { new: true }, (err, updatedUser) => { if (err) { console.error(err); } else { console.log('更新后的用户:', updatedUser); } }); ``` 4. 删除数据: ```javascript const User = require('./models/user'); // 引入模型 User.findOneAndDelete({ user: 'John' }, (err, deletedUser) => { if (err) { console.error(err); } else { console.log('已删除的用户:', deletedUser); } }); ``` 请注意,上述示例中的`./models/user`是一个模型文件的路径,你需要根据你的实际情况进行修改。同时,你还需要根据你的数据库配置修改连接字符串中的`database_name`。 希望以上代码能帮助到你进行Mongoose增删改查操作。 #### 引用[.reference_title] - *1* *3* [Mongoose 操作数据库实现增、删、改、查](https://blog.csdn.net/weixin_40629244/article/details/104906844)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [mongoose增删改查](https://blog.csdn.net/qq_40816649/article/details/88059295)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值