问题描述
我正在尝试在一个事务中从java插入一个带序列号的文档。
I am trying to insert a document with a sequence number, in one transaction, from 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"
});
是否可以从java执行此操作?最好使用官方的java驱动程序。
Is it possible to do this from java? Preferably with the official java driver.
推荐答案
按照,我们通过。
示例实施:
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);
}
}
必须特别注意支付给 findAndModify
方法。在Java MongoDB驱动程序(2.12.4)中,该方法有4种不同的签名。
您必须使用一个允许您传递查询的方法
object, update
object和 returnNew
boolean(必须设置为 true
)。
Special attention must be paid to the findAndModify
method. In the Java MongoDB driver (2.12.4), the method is available with 4 different signatures.
You must use one which lets you pass a query
object, update
object and returnNew
boolean (which has to be set to true
).
这是因为,根据:
默认情况下,返回的文档不包含对更新所做的修改。要返回包含更新修改的文档,请使用新选项。
That's because, according to documentation:
By default, the returned document does not include the modifications made on the update. To return the document with the modifications made on the update, use the new option.
我们需要返回包含所做修改的文档在更新。
We need to return the document with the modifications made on the update.
这篇关于使用java中的autoincrement字段在mongodb中插入文档的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!