我正在使用mongoDB和Java SpringData开发日志寄存器。
这里MongoDb capped sub-collection讨论了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/)
答案 0 :(得分: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);
}
我希望对其他人有用!!!
答案 1 :(得分:0)
正如您所注意到的,MongoDB无法提供此功能,因此必须在应用层上解决。
默认情况下,Java不支持任何像capped集合一样工作的东西。但是the collection library of the Apache Commons project有CircularFiFoBuffer类似乎是你需要的。您可以使用最大尺寸创建它。添加新元素并且它已经处于最大大小时,将丢弃最旧的元素。迭代顺序是从最旧的元素到最新的元素。
使用LinkedList可以完成没有外部库的解决方法。使用addFirst()方法添加新元素,检查大小,当它大于所需的最大大小时,调用removeLast()。