MongoDB 内嵌数组操作 分页排序查询及更新数据

网上对于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);
}

你可能感兴趣的:(软件开发)