mongodb实现字段值自动增长功能示例
Admin 2021-04-23 群英技术资讯 2029 次浏览
MongoDB是一个基于分布式文件存储的数据库,是由C++语言编写的,目的在于为web应用听可扩展的高性能数据存储解决方案。MongoDB与SQL还是存在很大不同的,例如它没有像 SQL 一样有自动增长的功能,那么mongodb字段值自增长要如何实现呢?
MongoDB 的 _id 是系统自动生成的12字节唯一标识,但在某些情况下,我们可能需要实现 ObjectId 自动增长功能。由于 MongoDB 没有实现这个功能,我们可以通过编程的方式来实现,以下我们将在 counters 集合中实现_id字段自动增长。
期望_id字段从1,2,3,4到n,启动一个自动递增的整数序列,如:
{
"_id":1,
"title": "标题",
"content": "内容1",
"type": "类型"
}
为此,创建 counters 集合,序列字段值可以实现自动长:
db.createCollection("counters")
初始化集合,以objId作为主键,sequence_value 字段是序列通过自动增长后的一个值:
db.counters.insert({_id:"objId",sequence_value:0})
查询返回更新后的序列号
db.counters.findAndModify({
query: {_id: "objId" },
update: {$inc:{sequence_value:1}},
new: true
}).sequence_value;
操作符解释:
$inc可以对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作;
db.collection.findAndModify({
query: <document>, //定义关于哪些记录需要修改的选择标准
sort: <document>, //确定选择标准检索多个文档时应修改的文档
new: <boolean>, //表示将显示修改后的文档
fields: <document>, //指定要返回的字段集
upsert: <boolean> //如果选择标准无法检索文档,则创建一个新文档
remove: <boolean> //为true,query指定的文档将从数据库中删除
)}
创建测试集合sms:
db.createCollection("sms")
在sms集合中新增文档,实现_id自增长:
db.sms.insert({
_id: db.counters.findAndModify({query:{_id: "objId" },update: {$inc:{sequence_value:1}},"new":true}).sequence_value,
title: "标题1",
content: "短信1",
type: "1"
})
查询sms集合:
db.sms.find({}).sort({_id:1})

java实现以上功能,数据库驱动版本不同运行效果有差异,仅供参考:
private MongoDatabase conn;
static{
this.conn = getDatabase(databaseName);
}
/**
* 连接数据库
* @param databaseName 数据库名称
* @return 数据库连接对象
*/
private static MongoDatabase getDatabase(databaseName){
MongoDatabase mongoDatabase = null;
try{
// 连接到 mongodb 服务
MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
// 连接到数据库
MongoDatabase mongoDatabase = mongoClient.getDatabase(databaseName);
System.out.println("Connect to database successfully");
}catch(Exception e){
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
}
return mongoDatabase;
}
/**
* 获取最新序列号
* @return 序列号
*/
private static int getNextSequenceValue(){
DBCollection collection = conn.getCollection("counters");
DBObject query = new BasicDBObject("_id", new BasicDBObject("$eq", "objId"));
DBObject newDocument =new BasicDBObject();
newDocument.put("$inc", new BasicDBObject().append("sequence_value", 1));
newDocument.put("new": true);
DBObject ret = collection.findAndModify(query, newDocument);
if (ret == null){
return 0;
}else{
return (Integer)ret.get("sequence_value");
}
}
/**
* 新增集合文档
*/
public static void addSms(){
int id = getNextSequenceValue();
if(id != 0){
DBCollection collection = conn.getCollection("sms");
List<Document> documents = new ArrayList<Document>();
for(int i = 0; i < 20; i++){
int id = getNextSequenceValue();
Document document = new Document("_id", id).
append("title", "标题" + i).
append("content", "短信" + i).
append("type", 1);
documents.add(document);
}
collection.insertMany(documents);
System.out.println("文档插入成功");
}
}
/**
* 查询集合
*/
public static void findSms(){
DBCollection collection = conn.getCollection("sms");
FindIterable<Document> findIterable = collection.find();
MongoCursor<Document> mongoCursor = findIterable.iterator();
while(mongoCursor.hasNext()){
System.out.println(mongoCursor.next());
}
}
以上就是关于是实现mongodb字段值自增长的介绍,有了字段自增长功能,那么在新增数据时,就不需要再手动插入值了,这样也可以更好的实现订单流水号、编码的流水号等功能。希望上述内容对大家有帮助,对mongodb字段值的介绍就到这,更多mongodb字段值内容大家可以关注其他文章。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
mongodb中条件查询不等于用$ne,示例:db.things.find({x:{$ne:3}});为查询x的值不等于3的数据。其中things为查找的对象。
MongoDB 索引 索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。 这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。 索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构 createIndex() 方法 MongoDB..
这篇文章主要给大家分享mongodb添加arbiter节点的步骤和过程,对大家了解mongodb添加节点有一定的帮助,感兴趣的朋友可以参考一下,希望大家阅读完这篇文章能有所收获,下面我们一起来学习一下吧。
这篇文章给大家分享的是有关MongoDB中的常用操作的内容,小编觉得挺实用的,因此分享给大家做个参考。下文整理了很多MongoDB操作技巧,感兴趣的朋友接下来一起跟随小编看看吧。
Limit与Skip在MongoDB中是经常需要使用到的,但是对于Limit与Skip的使用方法并不是所有用户们都了解,那么你知道MongoDB中如何使用Limit与Skip吗?如果还不了解的小伙伴们不妨一起看看吧。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008