Ida*_*dar 3 java mongodb mongodb-java mongodb-query
我试图在一个事务中从java插入一个带序列号的文档.
与此类似的东西:
function getNextSequence(name) {
var ret = db.counters.findAndModify(
{
query: { _id: name },
update: { $inc: { seq: 1 } },
new: true
}
);
return ret.seq;
}
collection.insert({
number: getNextSequence("userid"),
name: "Some Name"
});
Run Code Online (Sandbox Code Playgroud)
是否有可能从java做到这一点?最好用官方的java驱动程序.
按照创建自动递增序列字段的文档,我们将其用于Java MongoDB驱动程序.
示例实现:
import java.net.UnknownHostException;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
public class TestAutoIncrement {
private final static String DB_NAME = "MyTestDB";
private final static String TEST_COLLECTION = "testCollection";
private final static String COUNTERS_COLLECTION = "countersCollection";
public static DBCollection testCollection;
public static DBCollection countersCollection;
public static void main(String[] args) {
try {
MongoClient mongoClient = new MongoClient();
DB database = mongoClient.getDB(DB_NAME);
testCollection = database.getCollection(TEST_COLLECTION);
countersCollection = database.getCollection(COUNTERS_COLLECTION);
} catch (UnknownHostException e) {
e.printStackTrace();
}
if (countersCollection.count() == 0) {
createCountersCollection();
}
createTestCollection();
}
public static void createCountersCollection() {
BasicDBObject document = new BasicDBObject();
document.append("_id", "userid");
document.append("seq", 0);
countersCollection.insert(document);
}
public static Object getNextSequence(String name) {
BasicDBObject searchQuery = new BasicDBObject("_id", name);
BasicDBObject increase = new BasicDBObject("seq", 1);
BasicDBObject updateQuery = new BasicDBObject("$inc", increase);
DBObject result = countersCollection.findAndModify(searchQuery, null, null,
false, updateQuery, true, false);
return result.get("seq");
}
public static void createTestCollection() {
BasicDBObject document = new BasicDBObject();
document.append("_id", getNextSequence("userid"));
document.append("name", "Sarah");
testCollection.insert(document);
document = new BasicDBObject();
document.append("_id", getNextSequence("userid"));
document.append("name", "Bob");
testCollection.insert(document);
document = new BasicDBObject();
document.append("_id", getNextSequence("userid"));
document.append("name", "Alex");
testCollection.insert(document);
}
}
Run Code Online (Sandbox Code Playgroud)
必须特别注意该findAndModify方法.在Java MongoDB驱动程序(2.12.4)中,该方法有4种不同的签名.
您必须使用一个允许您传递query对象,update对象和returnNew布尔值(必须设置为true)的对象.
这是因为,根据文档:
默认情况下,返回的文档不包括对更新所做的修改.要返回包含对更新所做修改的文档,请使用新选项.
我们需要返回包含更新修改的文档.