2014-10-29 3 views
3

Я пытаюсь вставить документ с порядковым номером в одной транзакции из java.Вставить документ в mongodb с полем автоинкремента из 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.

ответ

1

Попробуйте это:

DBCollection collection = database.getCollection("testCollection"); 
// create an increment query 
DBObject modifier = new BasicDBObject("counter", 1); 
DBObject incQuery = new BasicDBObject("$inc", modifier); 
// create a search query 
DBObject searchQuery = new BasicDBObject("name", "someName"); 
// increment a counter value atomically 
DBObject res = collection.findAndModify(searchQuery, incQuery); 
+0

Это обновит тот же объект, что мне нужно что-то, что вставляет новые объекты были одно поле увеличивается на единицу для каждого нового объекта. они должны выглядеть так: {name: "name", number: 1}, {name = "name", number: 2}, {name = "someothername", number: 3} – Idar

1

Вы не можете выполнить это в одной транзакции, и даже ваш Javascript пример выполняет findAndModify перед выполнением вставки.

Если вы хотите, чтобы вставить документы в коллекцию с увеличением кола-документов из этой коллекции можно использовать метод подсчета и добавление 1.

final DBCollection col = db.getCollection("myCollection"); 
    col.insert(new BasicDBObject("number", col.count() + 1)); 

или с помощью отдельной «счетчиков» коллекции с помощью findAndModify() вместо count()

5

Следуя документации для 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:
По умолчанию, возвращаемый документ не включает в себя изменения, внесенные на обновление. Чтобы вернуть документ с изменениями, внесенными в обновление, используйте новый параметр.

Нам необходимо вернуть документ с изменениями, внесенными в обновление.

1

так же, как Алекс написал, но этот код подходит для 3.x версий

import com.mongodb.*; 
import com.mongodb.client.MongoCollection; 
import com.mongodb.client.MongoDatabase; 
import org.bson.Document; 

public class TestAutoIncrement { 

    private final static String DB_NAME = "MyTestDB"; 
    private final static String TEST_COLLECTION = "testCollection"; 
    private final static String COUNTERS_COLLECTION = "countersCollection"; 

    private static MongoCollection<Document> testCollection; 
    private static MongoCollection<Document> countersCollection; 

public static void main(String[] args) { 

    MongoClient mongoClient = new MongoClient(); 
    MongoDatabase database = mongoClient.getDatabase(DB_NAME); 
    testCollection = database.getCollection(TEST_COLLECTION); 
    countersCollection = database.getCollection(COUNTERS_COLLECTION); 

    if (countersCollection.count() == 0) { 
     createCountersCollection(); 
    } 

    createTestCollection(); 
    mongoClient.close(); 
} 

public static void createCountersCollection() { 

    Document document = new Document(); 
    document.append("_id", "userid"); 
    document.append("seq", 1); 
    countersCollection.insertOne(document); 
} 

public static Object getNextSequence(String name) { 

    Document searchQuery = new Document("_id", name); 
    Document increase = new Document("seq", 1); 
    Document updateQuery = new Document("$inc", increase); 
    Document result = countersCollection.findOneAndUpdate(searchQuery, updateQuery); 

    return result.get("seq"); 
} 

public static void createTestCollection() { 

    Document document = new Document(); 
    document.append("_id", getNextSequence("userid")); 
    document.append("name", "Dinah"); 
    testCollection.insertOne(document); 

    document = new Document(); 
    document.append("_id", getNextSequence("userid")); 
    document.append("name", "Jonny"); 
    testCollection.insertOne(document); 

    document = new Document(); 
    document.append("_id", getNextSequence("userid")); 
    document.append("name", "Brody"); 
    testCollection.insertOne(document); 
} 

} 
Смежные вопросы