【问题标题】:Auto increment sequence in mongodb using java使用java在mongodb中自动递增序列
【发布时间】:2015-11-10 22:55:37
【问题描述】:

您好,我想使用 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 做到这一点?我对此完全陌生。

【问题讨论】:

标签: java mongodb mongodb-query


【解决方案1】:

首先使用Create an Auto-Incrementing Sequence Field,您应该使用mongoDB shell 创建集合,集合应该是:

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

所以你得到了包含_id,seq 之类的字段的counters 集合,现在在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计数并在main方法中使用此函数,如下:

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 集合中包含三个文档,分别包含name 作为Sarah C. and Bob D. 和一个我们第一次手动插入的默认文档,它增加seq 像这样{ "_id" : "userid", "seq" : 2 }

【讨论】:

  • 如果其中一个 put 操作失败并且没有使用该序列怎么办?
  • 现在用mlab怎么样?
  • 它是否仍然有效或自 5 岁以来得到更新?
【解决方案2】:
DBCollection collection = database.getCollection("Table Name");

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 2013-07-21
    • 2012-01-13
    • 2016-03-07
    • 1970-01-01
    • 2017-04-02
    相关资源
    最近更新 更多