MongoDB自增长主键,批量操作,distinct记录,条件组合查询
来源:互联网 发布:java卡牌类游戏源代码 编辑:程序博客网 时间:2024/06/05 20:37
一,创建自增长主键
在 mongodb 的命令行终端,创建一个 collection 比如 sequence,然后插入一条记录:
MongoDB Enterprise > db.sequence.insert({_id:"userseq",seq:0})WriteResult({ "nInserted" : 1 })
创建一个Service, 调用 mongodb 的一个 API,修改这个 sequence 里面的对象,并返回更改后的值作为程序即将保存的对象的 ID。
@Servicepublic class SequenceService {private Logger logger = LoggerFactory.getLogger(SequenceService.class);private static final String SEQ_COLLECTION = "sequence";private static final String PRIMARY_KEY = "_id";private static final String SEQUENCE_FIELD = "seq";@Autowiredprivate MongoTemplate temp;public Integer getNextUserSeq(){Integer seq = getNextSequence("userseq");logger.info("getNextUserSeq() 的下一个值 ::: " + seq);return seq;}private Integer getNextSequence(String name) {DBObject ret = temp.getCollection(SEQ_COLLECTION).findAndModify(Query.query(Criteria.where(PRIMARY_KEY).is(name)).getQueryObject(), null, null, false,new Update().inc(SEQUENCE_FIELD, 1).getUpdateObject(), true, false);return ((Double) ret.get(SEQUENCE_FIELD)).intValue();}}
注意, findAndModify 这个方法是重载的,如果 public DBObject findAndModify(final DBObject query, final DBObject update) 这个接口,将会返回修改前的值,比如值已经被这个接口从 4 改到 5 了,但是返回的却是 4,不是最新的 5。所以我程序里使用的是更多参数的接口,其倒是第二个参数设为 true, 意思是返回修改后的值。
还有一个就是这个返回值的类型是 Double 型的,最终返回前做一下类型转换。
最后,程序在保存对象的时候,调用 SequenceService.getNextUserSeq() 返回的值作为 ID 的值。
public void createUser(User user){encryptPassword(user);user.setId(seqService.getNextUserSeq());userDao.insert(user);}
二,使用 BulkOperations 类可以批量增删改对象。
public int enableUsers(List<String> userIds){BulkOperations bulkOps = temp.bulkOps(BulkMode.ORDERED, User.class);bulkOps.updateMulti(Query.query(Criteria.where("id").in(userIds)), Update.update("enabled", "1"));bulkOps.execute();return 1;}
三, distinct 获取记录的唯一字段数据
public List<String> getLoginNames(String mobile) {return (List<String>)temp.getCollection("user").distinct("loginName", Query.query(Criteria.where("mobile").is(mobile)).getQueryObject());}
但是如果希望通过 id 作为 Query 里的查询字段,那么注意了,不是我们定义的实体类比如这里 User 里的 id 字段,而应该是 MongoDB 保存 Collection 里面的的字段名,也就是 “_id”, 也就是说下面的语句才是可工作的:
public List<String> getLoginNames(Integer id) {return (List<String>)temp.getCollection("user").distinct("loginName", Query.query(Criteria.where("_id").is(id)).getQueryObject());}
public List<User> getUsersByNameLike(String keyword) {Query query = new Query();query.addCriteria(Criteria.where("loginName").ne("admin")) .addCriteria(new Criteria() .orOperator(Criteria.where("loginName").regex(keyword), Criteria.where("fullName").regex(keyword)));List<User> users = temp.find(query, User.class);return users;}
阅读全文
0 0
- MongoDB自增长主键,批量操作,distinct记录,条件组合查询
- Sql Server批量删除主键,添加自增长主键
- Mybatis 操作数据库的主键自增长
- 使用mybatis 实现批量插入,主键自增长
- 联合主键条件过滤查询,记录一点点
- C# MongoDB 多条件动态组合查询
- oracle主键自增长
- oracle 自增长主键
- oracle 自增长主键
- 主键自增长
- oracle主键自增长
- mysql 主键自增长
- oracle主键自增长
- oracle主键自增长
- mysql 主键自增长
- oracle主键自增长
- oracle主键自增长
- 主键自增长
- poj 2406 最小循环节kmp
- 把数组排成最小的数
- 第零章 数据结构基本知识
- Google Protocol Buffer 的使用和原理
- 浏览器内核
- MongoDB自增长主键,批量操作,distinct记录,条件组合查询
- OpenGL绘制三角形
- 查询用户用了哪些表空间
- 第三章 3.1 符号表
- 关于OpenGL的安装
- 010
- TCP之三次握手和四次挥手
- I2C双向电平转换电路设计
- java 构造方法的相互调用(在一个构造器中,通过this调用另一个构造器)