最近项目上有个需求需要通过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 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})