【问题标题】:Insert document in mongodb with autoincrement field from java使用来自java的自动增量字段在mongodb中插入文档
【发布时间】:2014-12-25 05:15:27
【问题描述】:

我正在尝试在一个事务中从 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驱动。

【问题讨论】:

    标签: java mongodb mongodb-query mongodb-java


    【解决方案1】:

    根据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 布尔值(必须设置为true)的方法。

    这是因为,根据documentation:
    默认情况下,返回的文档不包括对更新所做的修改。要返回对更新所做的修改的文档,请使用新选项。

    我们需要返回对更新所做的修改的文档。

    【讨论】:

      【解决方案2】:

      您不能在一个事务中执行此操作,甚至您的 javascript 示例在执行插入之前也会执行 findAndModify。

      如果您希望将文档插入到集合中,并且该集合中的文档数量不断增加,您可以使用 count 方法并添加 1。

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

      或者通过使用带有 findAndModify() 的单独“计数器”集合代替 count()

      【讨论】:

        【解决方案3】:

        试试这个:

        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);
        

        【讨论】:

        • 这将更新同一个对象,我需要插入新对象的东西,如果一个字段为每个新对象增加一。他们应该看起来像这样 {name:"name", number:1},{name="name", number:2},{name="someothername",number:3}
        【解决方案4】:

        正如 Alex 所写,但此代码适用于 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);
        }
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-05-29
          • 1970-01-01
          • 2014-10-30
          • 2014-01-10
          • 2013-11-18
          • 2017-01-13
          • 2017-04-20
          相关资源
          最近更新 更多