网上对于MongoDB内嵌数组操作这块的解说五花八门,其实结合Spring使用MongoTemplate操作,是非常方便的,闲话少叙上代码。
存入MongoDb中的数据格式:
{
"id": 1,
"storeIds": [1, 5, 10],
"content": "我是内容",
"type": 1,
"createTime": "2018-01-05 11:22:55"
"userIds": [
{
"userId": 100,
"readflag": true,
},
{
"userId": 200,
"readflag": false,
},
{
"userId": 300,
"readflag": true,
}
]
}
对应的实体类:
import lombok.Data;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable
// 创建的表名
@Document(collection = "message")
@Data
public class MessageEntity implements Serializable {
private Integer id;
private String content;
private Integer type;
@Indexed
private List<Integer> storeIds;
@Indexed
private List<UserIds> userIds;
private Date createTime;
}
@Data
public class UserIds implements Serializable {
private Integer userId;
private Boolean readFlag;
}
利用MongoTemplate对数据进行分页查询及排序,筛选条件为storeId和内嵌的userIds.userId及type。
import org.springframework.data.domain.Sort;
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;
// 每页显示的条数
private final static int ROWS = 10;
@Autowired
private MongoTemplate mongoTemplate;
/**
*
* @param storeId
* @param userId
* @param pageNumber 第几页(0起始)
* @param type 消息种类(1到10种类型)
* @return 集合
*/
public List<MessageEntity> getMessageList(Integer storeId, Integer userId, Integer pageNumber, Integer type) {
// where("userIds.userId").is(userId)可以直接筛选内嵌的数据;in()的用法和sql一样。
Query query = new Query(Criteria.where("userIds.userId").is(userId).and("storeIds").is(storeId).and("type").in(1,2,6));
// skip()和limit()进行分页查询,从第几条开始,查几条;with(new Sort()))进行排序
return mongoTemplate.find(query.skip(pageNumber * ROWS).limit(ROWS).with(new Sort(Sort.Direction.DESC, "createTime")), MessageEntity.class);
}
查看消息后需要更改内嵌readFlag的状态,由false更为true。
public void updateMessageReadFlag(Integer id, Integer userId) {
Query query = new Query(Criteria.where("id").is(id).and("userIds.userId").is(userId));
// 以内嵌的userId作为条件更新数据,注意$。
Update update = Update.update("userIds.$.readFlag", true);
mongoTemplate.upsert(query, update, MessageEntity.class);
}