使用Java在MongoDB中自增序列

12

嗨,我想使用Java在MongoDB中自动递增_id。 我完全不了解这个。 在文档中,我找到了以下解决方案:

db.counters.insert(
 {
      _id: "userid",
      seq: 0
   }
)


function getNextSequence(name) {
var ret = db.counters.findAndModify(
{
query: { _id: name },
update: { $inc: { seq: 1 } },
new: true
}
);
return ret.seq;
}

db.users.insert(
{
_id: getNextSequence("userid"),
name: "Sarah C."
}
)

有人能建议我如何使用Java实现这个吗?我完全是新手。


请查看以下网址:http://stackoverflow.com/questions/20540700/how-can-i-auto-increment-a-field-in-mongodb-using-java-code - Swapnil
2个回答

13

使用创建自增序列字段方法,首先你需要在 MongoDB Shell 中创建一个符合以下规范的集合:

db.counters.insert(
{
  _id: "userid",
  seq: 0
})

你会得到一个包含字段如 _id, seq 的计数器集合,现在在 Java 中创建名为 getNextSequence 的函数,并且该函数有一个字符串类型的参数 userid,因此 getNextSequence 函数如下:

public static Object getNextSequence(String name) throws Exception{
    MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
    // Now connect to your databases
    DB db = mongoClient.getDB("demo");
    DBCollection collection = db.getCollection("counters");
    BasicDBObject find = new BasicDBObject();
    find.put("_id", name);
    BasicDBObject update = new BasicDBObject();
    update.put("$inc", new BasicDBObject("seq", 1));
    DBObject obj =  collection.findAndModify(find, update);
    return obj.get("seq");

上述函数返回 seq 的数量,并在主方法中使用该函数,如下所示:

public static void main(String[] args) throws Exception {

    MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
    // Now connect to your databases
    DB db = mongoClient.getDB("demo");
    DBCollection collection = db.getCollection("counters");
    BasicDBObject document = new BasicDBObject();

    document.put("_id", getNextSequence("userid"));
    document.put("name","Sarah C.");
    collection.insert(document); // insert first doc

    document.put("_id", getNextSequence("userid"));
    document.put("name", "Bob D.");
    collection.insert(document); // insert second doc
}

现在在 counters 集合中包含三个文档,这些文档分别包含名称为 Sarah C. 和 Bob D. name ,以及我们在第一次手动插入时增加了 seq 的一个默认文档,如下所示: {"_id": "userid", "seq": 2}


如果其中一个put操作失败并且该序列未被使用,会发生什么? - Yiping
此刻使用 mlab 怎么样? - Stu_Dent
这个程序自 5 年前以来还能用吗?或者已经有更新了吗? - Stu_Dent

3
DBCollection collection = database.getCollection("Table Name");

DBObject modifier = new BasicDBObject("counter", 1);
DBObject incQuery = new BasicDBObject("$id", modifier);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接