MongoDB:简单的增删改查操作

一.概述

本篇文章介绍在Navicat中对MongoDB数据库进行增删改查操作,在后面会介绍在Spring Boot中使用MongoTemplate对MongoDB数据库进行相关操作.如有必要可以先看看前面几篇文章.

MongoDB:MySQL,Redis,ES,MongoDB的应用场景

MongoDB:数据库初步应用

二.在Navicat进行增删改查操作

2.1 新增数据

MongoDB有以下几种方法对数据进行新增.

  1. insert() 插入单个或者多个数据(文档);

  2. save() 如果新新增数据主键存在那么就修改,如果不存在就新增.

  3. insertOne()新增一条数据

  4. insertMany()新增多条数据.

其中insertOne,insertMany与insert()的功能重复,所以这里就不多做介绍了.

2.1.1 insert()新增数据

示例代码如下:

db.user_search_record.insert({
	uuid:"c5e41a77a87c776c7cdbe521294ddcf6"
	,keyword:"剪纸用品"
	,time:ISODate()
	,userId:"0f6bea039ca64c9e81c7bdb43f1587ca"}
)

对照语法格式如下:

db.集合名称.insert(
    JSON格式的键值对
)

这里需要主要的是db不能省略,不然会提示集合(表)名称未定义.

在上面案例中ISODate()获得的是格林威治时间,需要在上面+8才能获得北京时间,时间格式时候yyyy-MM-dd HH:mm:ss

下面代码添加多条记录,多条记录需要用 [ ] 符号,表示是一个数组.

db.user_search_record.insert([
{
	uuid:"c5e41a77a87c776c7cdbe521294ddcf6"
	,keyword:"日用商品"
	,time:ISODate()
	,userId:"0f6bea039ca64c9e81c7bdb43f1587ca"},
{
	uuid:"c5e41a77a87c776c7cdbe521294ddcf6"
	,keyword:"食品"
	,time:ISODate()
	,userId:"0f6bea039ca64c9e81c7bdb43f1587ca"},
])

在MongoDB的集合中存在_id字段,作为文档的主键,如果没有指定,会自动生成.

2.1.2 使用save()保存文档

save()的语法格式与insert()格式类似,示例代码如下:

db.user_search_record.save({
	uuid:"c5e41a77a87c776c7cdbe521294ddcf6"
	,keyword:"现切水果"
	,time:ISODate()
	,userId:"0f6bea039ca64c9e81c7bdb43f1587ca"}
)

上面代码没有指定_id所以等同于insert(),将新增一条代码.如果我们指定_id,将判断_id是否存在,如果存在那么就修改原数据,如果不存在,那么新增,示例代码如下:

db.user_search_record.save({
	_id:ObjectId("64dc2cc9045b0000260056f5"),
	uuid:"c5e41a77a87c776c7cdbe521294ddcf6"
	,keyword:"绿叶水果"
	,time:ISODate()
	,userId:"0f6bea039ca64c9e81c7bdb43f1587ca"}
)

在上面代码中需要注意_id是MongoDB特有的数据类型:ObjectId,所以需要用到ObjectId()这个方法对字符串进行转换,并且不能省略.如果上面的_id存在将对数据进行修改,如果不存在那么将新增.

与insert()不同的是save()一次只能操作一条数据.

2.2 更新数据

更新数据常见的方法有update(),save(),updateOne(),updateMany(),replaceOne().其中save在上面已经介绍了,

2.2.1 update()更新数据

下面代码使用update方法更新数据

db.product_detail.update(
{_id:ObjectId("64db394fd5b10c163f4ce01d")},
{$set:{title:"正宗山东烟台红富士又红又甜 顺丰包邮"}}
)

其语法格式如下:

db.product_detail.update(
{查询条件},
{$set:更新字段}
)

在上面的更新中,默认只会更新匹配到的第一条语句,如果需要更新所有匹配到的语句需要设置multi为true,这个值默认为false(不进行多条语句更新),示例如下面的代码将更新多条匹配的语句:

db.product_detail.update(
{title:"享受正宗的新疆李子美味"},
{$set:{title:"正宗的新疆李子顺丰包邮到家 皮薄美味丰富维C"}},
{multi:true}
)

2.2.2 其它更新语法介绍

其它更新语法不常用,只做简单介绍,updateOne()只更新匹配到的第一条语句,updateMany()更新多条语句,reaplaceOne()只更新匹配到的第一条语句.

2.3 删除数据

MongoDB中删除也有多种方法:remove(),deleteOne(),deleteMany(),最常用的是remove()方法.

2.3.1 remove()方法删除数据

remove的语法与update语法有相似之处,示例代码如下:

db.user_search_record.remove(
{_id:ObjectId("64db3bf7d5b10c163f5469d5")}, 
{justOne:true}
)

其语法格式如下:

db.集合名称.remove(
{筛选条件}, 
{可选参数}
)

在上面的代码中justOne:true表示只删除一条数据,这个值默认为false,也就是会删除所有匹配到的数据.在做删除之前最好先根据删除条件做一次查询,避免被误删.

2.3.3 其它删除方法

deleteOne()一次删除一个文档

deleteMany()一次删除多条匹配到的文档.

上面这两个方法都可以用remove()代替.

2.4 基本查询

任何数据库中查询是所有操作中最重要和常用的环节,我们需要从以下几个方面逐步了解

2.4.1 比较操作符

在前面的操作中,我们已经发现了mongoDB以$作为关键字的标志,这查询中也是一样.

$eq : 查询相等

$ne: 查询不相等

$gt, $gte: 查询大于,大于等于条件的文档

$lt, $lte : 查询小于, 小于等于条件的文档

$in, $nin: 查询条件必须是数组, 查询存在或者不存在这个数组里面值的文档.

2.4.2 逻辑操作符

$and : 用于多条件查询,表示并且

$or : 用于多条件查询,表示或

$nor : 用于多条件查询,表示查询文档必须不符合所有条件

$not : 只能用于一个条件查询,表示文档不符合查询条件.

2.4.3 元素操作符

$exists: 判断指定字段是否存在.

$type: 判断指定字段的数据类型

使用find()方法进行查询,案例如下:

db.product_detail.find(
	{
		$and:[ 	//and中列出了三个条件必须都要满足
				{categoryId:{$eq:32}}
			, {productRating:{$gte:4.9}}
			, {shopId:{$not:{$eq:"4d3f317917543ab3c1ebed6300453f69"}}}
			],
		$or:[		//or列出了两个条件,必须满足其中一个
			  {positiveReviews:{$gte:300}}
			, {badReviews:{$lt:10}}
			]
	}
)

find方法接受一个json数据,其中and和or作为数据中的两个属性,这两个属性可以接受数组作为属性值.

2.4.4 模糊查询

在mongoDB中,模糊查询是采用的正则表达式的方式,例如下面的代码:

db.product_detail.find(
	{
		$and:[
			{address:"深圳"}
			,{productRating:{$gte:4.5}}
			,{title:{$regex:"西瓜",$options:["i","x","s"]} }]
	}
)

$regex:"西 瓜" 是指定title字段需要模糊匹配西瓜这两个字.

$options:是设置可选参数, i表示忽略大小写,x表示忽略空格,s表示忽略换行.

三.Spring Boot 对MongoDB进行增删改查

先引用mongoTemplate

@Resource
private MongoTemplate mongoTemplate;    //mongoDB操作模板

3.1 新增文档

/**
     * 添加用户的收货地址
     * @param userAddress
     * @return 返回主键
     */
    @Override
    public String addAddress(UserAddress userAddress){
        //向集合中添加数据,如果没有指定_id,那么会自动生成
        userAddress = mongoTemplate.insert(userAddress);
        //返回生成的uid
        return userAddress.get_id();
    }

3.2 更新文档

/**
     * 更新用户的收货地址
     * @param userAddress
     * @return
     */
    @Override
    public boolean updateAddress(UserAddress userAddress){
        //创建查询对象
        Query query = new Query();
        //根据主键创建查询语句
        query.addCriteria(Criteria.where("_id").is(userAddress.get_id()));
        //创建更新对象
        Update update = new Update();
        //根据键值对添加更新数据
        update.set("address",userAddress.getAddress());
        update.set("province",userAddress.getProvince());
        update.set("tel",userAddress.getTel());
        update.set("city",userAddress.getCity());
        update.set("recipient",userAddress.getRecipient());
        update.set("isDefault",userAddress.getIsDefault());
        //将检索出来的对象进行更新
        UpdateResult result =  mongoTemplate.updateFirst(query,update,UserAddress.class);
        //判断被修改的文档数据量
        if(result.getModifiedCount()>0){
            return true;
        }else{
            return false;
        }
    }

3.3 删除文档

/**
     * 根据主键编号移除用户的收货地址:实际操作为将用户的收货地址的isDelete值改为true(1)
     * @param id
     * @return true:成功
     */
    @Override
    public boolean removeAddress(String id){
        //创建查询标准
        Query query = new Query();
        query.addCriteria(Criteria.where("_id").is(id));
        //将数据的isDeleted字段改为true
        Update update = new Update();
        update.set("isDeleted",Byte.valueOf("1"));
        UpdateResult result = mongoTemplate.updateFirst(query,update,UserAddress.class);
        if(result.getModifiedCount()>0){
            return true;
        }else{
            return false;
        }
    }

3.4 查询文档

/**
     * 根据用户id查询这个用户的所有收货地址
     * @param uid 用户id
     * @return 收货地址集合
     */
    @Override
    public List<UserAddress> getAddressByUserId(String uid) {
        //创建查询对象
        Query query = new Query();
        //配置查询标准
        query.addCriteria(Criteria.where("userId").is(uid));
        List<UserAddress> list = mongoTemplate.find(query,UserAddress.class);
        return list;
    }

/**
     * 根据主键编号查询收货地址
     * @param id
     * @return
     */
    @Override
    public UserAddress getAddressById(String id){
        //创建查询标准
        Query query = new Query();
        query.addCriteria(Criteria.where("_id").is(id));
        //根据主键查询值需要返回一个对象
        UserAddress userAddress = mongoTemplate.findOne(query,UserAddress.class);
        return userAddress;
    }
相关推荐
tatasix18 分钟前
MySQL UPDATE语句执行链路解析
数据库·mysql
南城花随雪。31 分钟前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了32 分钟前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度34 分钟前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
天海华兮37 分钟前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql
gma9992 小时前
Etcd 框架
数据库·etcd
爱吃青椒不爱吃西红柿‍️2 小时前
华为ASP与CSP是什么?
服务器·前端·数据库
Yz98762 小时前
hive的存储格式
大数据·数据库·数据仓库·hive·hadoop·数据库开发
苏-言2 小时前
Spring IOC实战指南:从零到一的构建过程
java·数据库·spring
Ljw...2 小时前
索引(MySQL)
数据库·mysql·索引