2017-03-01 11 views
0

Java MongoDBドライバを使用してMongoDBにアイテムを挿入しようとしています。挿入するためにnextIdを挿入しようとしていますが、どうして私はいつもnextIdを4にしています。 Mongoにアイテムを挿入する前にnextIdを取得するために以下のメソッドを使用します。Java Mongo DB有効な次IDを取得できません

private Long getNextIdValue(DBCollection dbCollection) { 

    Long nextSequenceNumber = 1L; 

    DBObject query = new BasicDBObject(); 
    query.put("id", -1); 

    DBCursor cursor = dbCollection.find().sort(query).limit(1); 

    while (cursor.hasNext()) { 
     DBObject itemDBObj = cursor.next(); 
     nextSequenceNumber = new Long(itemDBObj.get("id").toString()) + 1; 
    } 

    return nextSequenceNumber; 
} 

私はmongodbコレクションに合計13レコードあります。私はここで間違っていますか?

+0

コレクション内のドキュメント数を取得するためにdb.collection.count()を使用し、結果を1つ増やしてnextIdを取得します。 – Cassian

+0

文書IDに増分整数を使用することは強くお勧めします。 [公式ガイド](https://docs.mongodb.com/v3.0/tutorial/create-an-auto-incrementing-field/#considerations)は「_一般的にはMongoDBでは自動増分パターンを使用しません_idフィールド、または任意のフィールドのために、大量のドキュメントを持つデータベースのために拡大縮小しないので。 –

答えて

0

しないでください。あなたは、ドライバが既にちょうどフィールドの右のタイプとアノテーションを使用し、最善の方法でこれを行うと悪い管理IDの状況を作成する必要はありません。

@Id 
@ObjectId 
private String id; 

その後、すべてのentitesを挿入するために、一般的な方法を記述します。

public T create(T entity) throws MongoException, IOException { 

    WriteResult<? extends Object, String> result = jacksonDB.insert(entity); 

    return (T) result.getSavedObject(); 
} 

これにより、idの時間インデックス付きハッシュが作成されます。これは、「次のID」よりもはるかに強力です。あなたは1

Stringに
nextSequenceNumber = new Long(itemDBObj.get("id").toString()) + 1; 

のような算術演算を実行するにはどうすればよい

https://www.tutorialspoint.com/mongodb/mongodb_objectid.htm

+0

数字のカスタム自動インクリメントIDが1,2,3,4 –

+0

である必要があります。内部ドライバの実装に関連しているため、「id」または「_id」のいずれとしても使用できません。したがって、別の名前の "序数"または何かを作成したい場合。しかし、NoSQLコンテキストでIDを使って正しく動作させようとしないでください。リレーショナル・データベースの概念を試しています。ただ違う –

0

このようなシーケンスのコレクションを作成してください。

{"id":"MySequence","sequence":1} 

その後、私は)b.collection.countを(使用して周りの仕事を見つけたID

// Query for sequence collection 
Query query = new Query(new Criteria().where("id").is("MySequence")); 

//Increment the sequence by 1 
Update update = new Update(); 
update.inc("sequence", 1); 

FindAndModifyOptions findAndModifyOptions = new FindAndModifyOptions(); 
findAndModifyOptions.returnNew(true); 

SequenceCollection sequenceCollection = mongoOperations.findAndModify(query, update,findAndModifyOptions, SequenceCollection.class); 
return sequenceModel.getSequence(); 
0

をインクリメントするアップデートを使用しています。私は単純に合計数を見つけて、私にIDを割り当てるために1つインクリメントオブジェクト。

関連する問題