数据格式

本文测试用的多层级数据格式基础数据如下:

{
    "id": "1",
    "warehouseConfigId": "1",
    "remarks": "备注信息",
    "groupGoodsInfo": [
        {
          	"ids":"1008601",
            "planNumber": "计划编号0001",
            "productId": "1",
            "shopName": "店铺名称01",
            "shopId": "1",
            "fnsku": "fnsku",
            "quantity": "9",
            "inventoryQuantity": "10",
            "remarks": "备注信息",
            "singleGoodsInfo": [
                {
                    "productId": "10010",
                    "shopName": "店铺名称01",
                    "shopId": "1",
                    "fnsku": "fnsku",
                    "singleProductQuantity": "2",
                    "quantity": "9",
                    "inventoryQuantity": "10"
                },
                {
                    "productId": "10011",
                    "shopName": "店铺名称02",
                    "shopId": "1",
                    "fnsku": "fnsku",
                    "singleProductQuantity": "2",
                    "quantity": "9",
                    "inventoryQuantity": "10"
                }
            ]
        },
      {
          	"ids":"1008602",
            "planNumber": "计划编号0001",
            "productId": "1",
            "shopName": "店铺名称01",
            "shopId": "1",
            "fnsku": "fnsku",
            "quantity": "9",
            "inventoryQuantity": "10",
            "remarks": "备注信息",
            "singleGoodsInfo": [
                {
                    "productId": "100101",
                    "shopName": "店铺名称01",
                    "shopId": "1",
                    "fnsku": "fnsku",
                    "singleProductQuantity": "2",
                    "quantity": "9",
                    "inventoryQuantity": "10"
                },
                {
                    "productId": "100111",
                    "shopName": "店铺名称02",
                    "shopId": "1",
                    "fnsku": "fnsku",
                    "singleProductQuantity": "2",
                    "quantity": "9",
                    "inventoryQuantity": "10"
                }
            ]
        }
    ]
}

MongoDB存储json格式数据

    /**
     * MongoDB存储json格式数据
     *
     * json数据可以是JSONObject,也可以是JSONArray
     *
     * @param jsonObject
     * @return
     */
    @PostMapping("/mongoAddJsonData")
    public Response mongoAddJsonData(@RequestBody JSONObject jsonObject){
        this.mongoTemplate.insert(jsonObject, "mongo_json_test");
        return Response.successResponse("新增成功");
    }

存储结果:
在这里插入图片描述

更新json对象中的嵌套对象

    /**
     * 更新json对象中的嵌套对象
     *
     * @return
     */
    @PostMapping("/mongoUpdateJson")
    public Response mongoUpdateJson(){
        Query query = new Query(Criteria.where("_id").is("60c1dd52c6f19836a37fddc6").and("groupGoodsInfo.ids").is("1008601"));
        Update update = Update.update("groupGoodsInfo.$.planNumber", "ABCD123456").set("groupGoodsInfo.$.shopName", "我被更新了!");
        mongoTemplate.updateFirst(query, update, "mongo_json_test");
        return Response.successResponse("更新成功");
    }

更新结果:
在这里插入图片描述

更新json对象中的多层嵌套对象

当数组中还有数组的时候,这个时候涉及到多层级嵌套更新,当前MongoDB不支持多个$,所以我这里采用的方法是,把超过2层的对象数据拿出来编辑好了再整个去更新。

    /**
     * 更新json对象中的多层嵌套对象
     *
     * @return
     */
    @PostMapping("/mongoUpdateJson3")
    public Response mongoUpdateJson3(){
        JSONArray jsonArray = new JSONArray();
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("songfayuan", "测试数据");
        jsonObject.put("age", "28");
        jsonObject.put("gender", "男");
        jsonArray.add(jsonObject);
        jsonArray.add(jsonObject);

        Query query = new Query(Criteria.where("_id").is("60c1dd52c6f19836a37fddc6").and("groupGoodsInfo.ids").is("1008601"));
        Update update = Update.update("groupGoodsInfo.$.singleGoodsInfo", jsonArray).set("groupGoodsInfo.$.remarks",jsonArray);
        WriteResult writeResult = mongoTemplate.updateFirst(query, update, "mongo_json_test");
        return Response.successResponse("更新成功");
    }

更新结果:
在这里插入图片描述

json数组中新增对象

    /**
     * json数组中新增对象
     *
     * @return
     */
    @PostMapping("/mongoUpdateJson2")
    public Response mongoUpdateJson2(){
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("songfayuan", "新的对象哦!!!!");
        jsonObject.put("age", "28");
        jsonObject.put("gender", "男");

        Query query = Query.query(Criteria.where("_id").is("60c1dd52c6f19836a37fddc6"));
        Update update = new Update();
        update.addToSet("groupGoodsInfo", jsonObject);
        mongoTemplate.upsert(query, update, "mongo_json_test");
        return Response.successResponse("更新成功");
    }

新增结果:
在这里插入图片描述

删除json数组中的一个对象

    /**
     * 删除json数组中的一个对象
     *
     * @return
     */
    @PostMapping("/mongoPullJson")
    public Response mongoPullJson(){
        Query query = Query.query(Criteria.where("_id").is("60c1dd52c6f19836a37fddc6"));
        BasicDBObject s = new BasicDBObject();
        s.put("songfayuan", "测试数据");
        Update update = new Update();
        update.pull("groupGoodsInfo", s);
        mongoTemplate.updateFirst(query, update, "mongo_json_test");
        return Response.successResponse("更新成功");
    }

删除结果:
在这里插入图片描述

更新json对象中的非嵌套对象

    /**
     * 更新json对象中的非嵌套对象
     *
     * @return
     */
    @PostMapping("/mongoUpdateJson1")
    public Response mongoUpdateJson1(){
        Query query = new Query(Criteria.where("_id").is("60c1dd52c6f19836a37fddc6"));
        Update update = Update.update("warehouseConfigId", "ABCD123456").set("remarks", "我被更新了!");
        mongoTemplate.updateFirst(query, update, "mongo_json_test");
        return Response.successResponse("更新成功");
    }

在这里插入图片描述

更新非数组嵌套对象

当groupGoodsInfo不是数组时,是一个对象时,更新对象。

数据格式:

{
    "id": "1",
    "warehouseConfigId": "1",
    "remarks": "备注信息",
    "groupGoodsInfo": {
        "ids": "1008601",
        "planNumber": "计划编号0001",
        "productId": "1",
        "shopName": "店铺名称01",
        "shopId": "1",
        "fnsku": "fnsku",
        "quantity": "9",
        "inventoryQuantity": "10",
        "remarks": "备注信息"
    }
}

新增结果:
在这里插入图片描述
更新非数组嵌套对象:

    /**
     * 更新非数组嵌套对象
     *
     * @return
     */
    @PostMapping("/mongoUpdateJson4")
    public Response mongoUpdateJson4(){
        Query query = new Query(Criteria.where("_id").is("60c1e63dc6f19836a37fde30"));
        Update update = Update.update("groupGoodsInfo.shopName", "啦啦啦啦啦啦").set("groupGoodsInfo.remarks", "我被更新啦!!!");
        mongoTemplate.updateFirst(query, update, "mongo_json_test");
        return Response.successResponse("更新成功");
    }

在这里插入图片描述

其他常用方法见如下工具中

package com.github.amazon.admin.controller.demo;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.github.amazon.common.util.Response;
import com.mongodb.BasicDBObject;
import com.mongodb.WriteResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.web.bind.annotation.*;

import java.util.*;

/**
 * MongoDB常用基础操作方法
 *
 * 测试代码中使用到的json格式如下
 * 
 * </p>
 *
 * @author songfayuan
 * @date 2021/6/10 5:35 下午
 */
@Slf4j
@RestController
@RequestMapping("/demo")
public class MongoDemoController {
    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * MongoDB新增数据
     *
     * 区别
     * 插入重复数据
     *   insert: 若新增数据的主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常提示主键重复,不保存当前数据。
     *   save: 若新增数据的主键已经存在,则会对当前已经存在的数据进行修改操作。
     *
     * 批操作
     *   insert: 可以一次性插入一整个列表,而不用进行遍历操作,效率相对较高
     *   save: 需要遍历列表,进行一个个的插入
     *
     * ---------------------
     * 作者:宋发元
     * 来源:CSDN
     * 原文:https://blog.csdn.net/u011019141/article/details/89192757
     * 版权声明:本文为博主原创文章,转载请附上博文链接!
     *
     * @param
     * @return Response
     * @author songfayuan
     */
    @PostMapping("/mongoSave")
    public Response mongoSave(){
        Map<String, Object> map = new HashMap<>();
        //map.put("_id", "10086");
        map.put("name", "songfayuan");
        map.put("age", "28");
        map.put("wechat", "songfayuan1688");
        this.mongoTemplate.save(map, "collectionName1");
        this.mongoTemplate.insert(map, "collectionName2");
        return Response.successResponse("新增成功");
    }

    /**
     * MongoDB存储json格式数据
     *
     * json数据可以是JSONObject,也可以是JSONArray
     *
     * @param jsonObject
     * @return
     */
    @PostMapping("/mongoAddJsonData")
    public Response mongoAddJsonData(@RequestBody JSONObject jsonObject){
        this.mongoTemplate.insert(jsonObject, "mongo_json_test");
        return Response.successResponse("新增成功");
    }

    /**
     * MongoDB根据条件删除数据
     *
     * @return
     */
    @DeleteMapping("/mongoRemove")
    public Response mongoRemove(){
        Query query = new Query();
        query.addCriteria(Criteria.where("_id").in("10086"));
        this.mongoTemplate.remove(query, "collectionName1");
        return Response.successResponse("删除成功");
    }

    /**
     * MongoDB根据条件更新数据
     *
     * @return
     */
    @PostMapping("/mongoUpdate")
    public Response mongoUpdate(){
        List<String> list = new ArrayList<>();
        list.add("10086");
        list.add("10000");
        Query query = new Query();
        query.addCriteria(Criteria.where("_id").in(list));
        Update update = new Update();
        update.set("age", "120");
        update.set("updateTime", new Date());
        this.mongoTemplate.updateMulti(query, update,"collectionName1");
        return Response.successResponse("更新成功");
    }

    /**
     * 更新json对象中的非嵌套对象
     *
     * @return
     */
    @PostMapping("/mongoUpdateJson1")
    public Response mongoUpdateJson1(){
        Query query = new Query(Criteria.where("_id").is("60c1dd52c6f19836a37fddc6"));
        Update update = Update.update("warehouseConfigId", "ABCD123456").set("remarks", "我被更新了!");
        mongoTemplate.updateFirst(query, update, "mongo_json_test");
        return Response.successResponse("更新成功");
    }

    /**
     * 更新json对象中的嵌套对象
     *
     * @return
     */
    @PostMapping("/mongoUpdateJson")
    public Response mongoUpdateJson(){
        Query query = new Query(Criteria.where("_id").is("60c1dd52c6f19836a37fddc6").and("groupGoodsInfo.ids").is("1008601"));
        Update update = Update.update("groupGoodsInfo.$.planNumber", "ABCD123456").set("groupGoodsInfo.$.shopName", "我被更新了!");
        mongoTemplate.updateFirst(query, update, "mongo_json_test");
        return Response.successResponse("更新成功");
    }

    /**
     * 更新json对象中的多层嵌套对象
     *
     * @return
     */
    @PostMapping("/mongoUpdateJson3")
    public Response mongoUpdateJson3(){
        JSONArray jsonArray = new JSONArray();
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("songfayuan", "测试数据");
        jsonObject.put("age", "28");
        jsonObject.put("gender", "男");
        jsonArray.add(jsonObject);
        jsonArray.add(jsonObject);

        Query query = new Query(Criteria.where("_id").is("60c1dd52c6f19836a37fddc6").and("groupGoodsInfo.ids").is("1008601"));
        Update update = Update.update("groupGoodsInfo.$.singleGoodsInfo", jsonArray).set("groupGoodsInfo.$.remarks",jsonArray);
        WriteResult writeResult = mongoTemplate.updateFirst(query, update, "mongo_json_test");
        return Response.successResponse("更新成功");
    }

    /**
     * 更新非数组嵌套对象
     *
     * @return
     */
    @PostMapping("/mongoUpdateJson4")
    public Response mongoUpdateJson4(){
        Query query = new Query(Criteria.where("_id").is("60c1e63dc6f19836a37fde30"));
        Update update = Update.update("groupGoodsInfo.shopName", "啦啦啦啦啦啦").set("groupGoodsInfo.remarks", "我被更新啦!!!");
        mongoTemplate.updateFirst(query, update, "mongo_json_test");
        return Response.successResponse("更新成功");
    }

    /**
     * json数组中新增对象
     *
     * @return
     */
    @PostMapping("/mongoUpdateJson2")
    public Response mongoUpdateJson2(){
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("songfayuan", "新的对象哦!!!!");
        jsonObject.put("age", "28");
        jsonObject.put("gender", "男");

        Query query = Query.query(Criteria.where("_id").is("60c1dd52c6f19836a37fddc6"));
        Update update = new Update();
        update.addToSet("groupGoodsInfo", jsonObject);
        mongoTemplate.upsert(query, update, "mongo_json_test");
        return Response.successResponse("更新成功");
    }

    /**
     * 删除json数组中的一个对象
     *
     * @return
     */
    @PostMapping("/mongoPullJson")
    public Response mongoPullJson(){
        Query query = Query.query(Criteria.where("_id").is("60c1dd52c6f19836a37fddc6"));
        BasicDBObject s = new BasicDBObject();
        s.put("songfayuan", "新的对象哦!!!!");
        Update update = new Update();
        update.pull("groupGoodsInfo", s);
        mongoTemplate.updateFirst(query, update, "mongo_json_test");
        return Response.successResponse("更新成功");
    }

    /**
     * MongoDB获取数据库中的所有文档集合
     *
     * @return
     */
    @GetMapping("/mongoGetCollectionNames")
    public Response mongoGetCollectionNames(){
        Set<String> set = this.mongoTemplate.getCollectionNames();
        return Response.success(set);
    }

    /**
     * MongoDB根据条件查询一条数据
     *
     * @return
     */
    @GetMapping("/mongoFindOne")
    public Response mongoFindOne() {
        Query query = new Query();
        query.addCriteria(Criteria.where("_id").is("10086"));
        return Response.success(this.mongoTemplate.findOne(query, Map.class,"collectionName1"));
    }

    /**
     * MongoDB根据条件查询列表数据
     *
     * @return
     */
    @GetMapping("/mongoFindList")
    public Response mongoFindList() {
        Query query = new Query();
        query.addCriteria(Criteria.where("name").is("songfayuan"));
        return Response.success(this.mongoTemplate.find(query, Map.class,"collectionName1"));
    }

}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐