[英]Saving with Java springdata a mongoDB document with capped array ($slice and $sort)
我正在使用mongoDB和Java SpringData開發日志寄存器。
在這里, MongoDb的子集合加蓋了有關mongoDB結構的討論,但是我會使用Java。 最重要的是,我有一個包含一個或多個字段和一個上限數組的文檔。
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;
}
編輯 :
我正在將Java與Spring源代碼一起使用(mongodb驅動程序v2.10.1: http ://central.maven.org/maven2/org/mongodb/mongo-java-driver/2.10.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);
}
希望對其他人有用!!!
您已經注意到,MongoDB無法提供此功能,因此必須在應用程序層上解決它。
Java默認情況下不支持任何類似於上限集合的功能。 但是,Apache Commons項目的集合庫中的類CircularFiFoBuffer似乎正是您所需要的。 您以最大大小創建它。 當您添加一個新元素並且已經達到最大大小時,最舊的元素將被丟棄。 迭代順序是從最早的元素到最新的元素。
沒有外部庫的解決方法可以通過LinkedList完成。 使用addFirst()方法添加新元素,檢查大小,當它大於所需的最大大小時,調用removeLast()。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.