【问题标题】:Saving with Java springdata a mongoDB document with capped array ($slice and $sort)使用 Java springdata 保存带有上限数组($slice 和 $sort)的 mongoDB 文档
【发布时间】:2013-04-16 08:31:03
【问题描述】:

我正在使用 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;
}

编辑

我正在使用带有 Spring 源的 Java(mongodb 驱动程序 v2.10.1:http://central.maven.org/maven2/org/mongodb/mongo-java-driver/2.10.1/

【问题讨论】:

  • 是什么阻止了您在保存之前检查和切割messages 大小?
  • @Vladimir 我需要使用 Capped Arrays (docs.mongodb.org/manual/tutorial/…),因为它直接使用 mongoDB。
  • 1.请说清楚:您是使用 Java API,还是直接从 mongo shell 查询 MongoDB? 2. 为什么不能将DBCollection.udpate 第二个参数形成为 {"$push": ... $slice:-3}}}?
  • 是的弗拉基米尔,我正在尝试使用“DBCollection.update”,但我认为这个功能会实现。

标签: java mongodb sorting spring-data slice


【解决方案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);
}

希望对其他人有用!!!

【讨论】:

    【解决方案2】:

    如您所见,MongoDB 无法提供此功能,因此必须在应用层解决。

    默认情况下,Java 不支持任何像封顶集合一样工作的东西。但是the collection library of the Apache Commons projectCircularFiFoBuffer 类,这似乎是你需要的。您使用最大尺寸创建它。当您添加一个新元素并且它已经达到最大大小时,最旧的元素将被丢弃。迭代顺序是从最旧的元素到最新的元素。

    没有外部库的解决方法可以使用LinkedList 完成。使用 addFirst() 方法添加新元素,检查大小,当它大于所需的最大大小时,调用 removeLast()。

    【讨论】:

    • 这是我想使用的最后一个资源!我正在尝试使用 DBObject 和 BasicDBObject。顺便说一句,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多