1

mongoDB と Java SpringData を使用してログ レジスタを開発しています。

ここでは、MongoDb capped サブコレクションで mongoDB の構造について説明していますが、私は Java を使用します。最も重要なことは、1 つ以上のフィールドと capped 配列を含むドキュメントがあることです。

Javaでこれを行う方法または方法はありますか?

私のオブジェクトは次のようなものです:

user = {
   name: String,
   latest_messages: [String] (capped to a 100 elements)
}

Javaで:

public class MessageLog {
    private ObjectId id;
    private String name;
    private List<Message> messages;
}

どこ:

public class Message{
    private String text;
    private String level;
    private Date date;
}

編集

Spring ソースで Java を使用しています (mongodb ドライバー v2.10.1: http://central.maven.org/maven2/org/mongodb/mongo-java-driver/2.10.1/ )

4

2 に答える 2

1

私は最終的にこのコードを使用してソリューションを取得します:

// Define the search query
BasicDBObject searchQuery = new BasicDBObject().append("idU", idUser);

// To create the json query to modify
BasicDBObject logDocument = new BasicDBObject();

// Create the object and add it to a list (because the $each require a list)
List<DBObject> list = new ArrayList<DBObject>();
DBObject object = new BasicDBObject().append("text", logMessage.getText());
object.append("level", logMessage.getLevel())
object.append("date", logMessage.getDate());
list.add(object);

// Create the $sort and $slice query at the same time
logDocument.append(
    "$push",
    new BasicDBObject().append("logs", new BasicDBObject().append("$each", list).append("$sort", new BasicDBObject().append("date", 1))
            .append("$slice", -10)));

String json = "{findAndModify:\"collectionLog\", query:" + searchQuery.toString() + ", update: " + logDocument.toString() + ", upsert:true}";

try {
     getMongoTemplate().executeCommand(json);
} catch (Exception e) {
     System.out.println(e);
}

他の誰かに役立つことを願っています!!!

于 2013-04-18T09:37:26.253 に答える
0

お気づきのように、MongoDB はこの機能を提供できないため、アプリケーション層で解決する必要があります。

デフォルトでは、Java はキャップ付きコレクションのように機能するものをサポートしていません。しかし、Apache Commons プロジェクトのコレクション ライブラリには、必要と思われるクラスCircularFiFoBufferがあります。最大サイズで作成します。新しい要素を追加すると、すでに最大サイズになっている場合、最も古い要素が破棄されます。反復順序は、最も古い要素から最も新しい要素へです。

外部ライブラリを使用しない回避策は、LinkedListを使用して実行できます。addFirst() メソッドを使用して新しい要素を追加し、サイズを確認して、目的の最大サイズよりも大きい場合は、removeLast() を呼び出します。

于 2013-04-16T13:37:18.297 に答える