Следуя документации для creating an Auto-Incrementing Sequence Field, мы адаптируем ее для использования на Java с помощью Java MongoDB 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 различными сигнатурами.
Вы должны использовать объект, который позволяет передать объект query
, объект update
и returnNew
boolean (который должен быть установлен в true
).
Это потому, что, согласно documentation:
По умолчанию, возвращаемый документ не включает в себя изменения, внесенные на обновление. Чтобы вернуть документ с изменениями, внесенными в обновление, используйте новый параметр.
Нам необходимо вернуть документ с изменениями, внесенными в обновление.
Это обновит тот же объект, что мне нужно что-то, что вставляет новые объекты были одно поле увеличивается на единицу для каждого нового объекта. они должны выглядеть так: {name: "name", number: 1}, {name = "name", number: 2}, {name = "someothername", number: 3} – Idar