繁体   English   中英

使用Java springdata保存带有上限数组($ slice和$ sort)的mongoDB文档

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM