mongodb java crud项目中使用

最近项目上有个需求需要通过skuProperty查询出skuId,再通过skuId查询skuProperty,但是skuProperty最多有9个,通过mysql查询时即使分页查10条sku,关联属性查询有90多条吧,在navicat上执行得1.5s-2s,同一页面会多次调用此接口,有10s左右,所以需要优化,加缓存通过测试mongoDB可以满足需求,solr是否可以满足?查询数组的listkeyname:$all{"propertyCode":value,"propertyValueCode":value}

db.getCollection('test.test').find({"propertyCodePropertyValueCodeList":{$all:[{"propertyCode":"0101","propertyVaueCode":"01"}]}})

有个skuProperty还存入别的字段,不止propertyCode和propertyValueCode两个字段,所以不能直接使用$all,需要专门把那两个字段存入一个list,使用$all匹配

pom.xml文件中加入:spring-boot-starter-data-mongodb  //artifactId

yml文件中:

spring.data.mongodb:

    host:10.130.207.155

    port:27017

    database:discountdb

    username:disc2017

    password:disc@TK123

查询时BasicDBList basicDBList= new BasicDBList(); 

condition.get(0).entrySet().stream().forEach(entry->{

BasicDBObject basicDBObject = new BasicDBObject();

basicDBObject.put("propertyCode",entry.getKey());

basicDBObject.put("propertyValueCode",entry.getKey());

basicDBList.add(basicDBObject);

});

DBObject obj = new BasicDBObject();

obj.put("$all",basicDBList);

DBObject objParam = new BasicDBObject();

objParam.put("propertyCodePropertyValueCodeList",obj);

objParam.put("deleteFlag",0);

objParam.put("saleState",1);

Query query = new BasicQuery(objParam);//BasicQuery组织字符串也可以

//不使用实体接收 id是int类型和mong数据库_id不匹配实体是String或bigInt才可以直接查询映射封装

List<DBObject> returnList = new LinkedList();

query.skip(pageBean.getOffset().intValue);

query.skip(pageBean.getLimit().intValue);

mongoTemplate.executeQuery(query,collectonName,callback);

returnList.stream.forEach(dbObject->dbObject.removeField("_id"));

mongoTemplate.find(query,MerSku.class);//MerSku实体上加注解@Document spring.core.mongo

新增时如果遇到id需要转json处理去掉

mongoTemplate.insert(skuList,collectionName);//save方法  有相同key时会抛异常自己捕获异常  对应db.sku.insertMany()

更新时需要先查出来

Query query = new Query();

query.addCriteria(Criteria.where("_id").in(skuIdList));{"key":"value"} where("key").is(value)

Update.set("deleteFlag",1);

mongoTemplate.updateMulti(query,update,collectionName);

mongoTemplate.findAndModify(query,update,collectionName);

//1万多条,定时器每5s执行一次,每次1000一条

query.addCriteria(Criteria.where("skuPropertyList.propertyCode").is("JUZHU0102(b)199");//lvju

query.addCriteria(Criteria.where("skuPropertyList.propertyValueCode").is("04");

Update.set("skuPropertyList.$.propertyValueCode","03");//将集合对象中某字段04替换为03 每次只能替换一条数据

update.addToSet("propertyCodePropertyValueCodeList",":03");//添加03

update.pull("propertyCodePropertyValueCodeList",":04");//查询03和04都有的

数组中存入string,不能直接替换更新,可使用先添加后删除如只有04替换成03,可先加03,然后将03和04同时存在的数据删除掉04

查询指定key不存在的find({"key":false}),查询返回部分字段find({condition},{"key":1})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值