mongodb上限集合

在MongoDB中,可以以循环方式将文档的插入顺序保留到集合中。 这些类型的集合在MongoDB中称为上限集合。 MongoDB文档描述了上限集合:

上限集合是固定大小的集合,它们支持高吞吐量操作,这些操作根据插入顺序来插入,检索和删除文档。 封顶的集合的工作方式类似于循环缓冲区:一旦集合填满了分配的空间,它就会通过覆盖集合中最旧的文件来为新文件腾出空间。”

好的,所以我们知道什么是上限集合,但是如何创建集合呢?

在MongoDB Shell中,我们将使用db.createCollection命令创建一个有上限的集合:

db.createCollection("logs", {capped: true,
                             size: 4096,
                             max:5})

该命令告诉MongoDB创建一个称为“日志”的集合,最大大小为4096字节,最多可容纳5个文档。 当添加第6个文档时,第一个文档将从集合中删除,确保该集合中最多只能有5个文档。 “ size”参数是必需的,但是“ max”参数是可选的。

在Java中,有两种与MongoDB进行通信的常用方法: MongoDB Java驱动程序以及Morphia (用于将Java对象映射到MongoDB或从MongoDB映射的轻量级类型安全映射库)。

首先,让我们首先来看一下Java驱动程序。

Java驱动

再次使用Java驱动程序,我们使用db.createCollection命令,这一次传递了BasicDBObject作为参数。 此参数具有字段“封顶”,“大小”和“最大”,这些字段指定对集合进行封顶,集合的最大大小(以字节为单位)和集合中的最大条目数。 以下代码段显示了如何连接到MongoDB的本地实例并创建上限集合。

MongoClient mongoClient = new MongoClient(new MongoClientURI("mongodb://localhost"));
DB db = mongoClient.getDB("test");

DBCollection collection;
if (!db.collectionExists("cappedLogsJavaDriver")) {
    BasicDBObject options = new BasicDBObject("capped", true);
    options.append("size", 4096);
    options.append("max", 5);
    collection = db.createCollection("cappedLogsJavaDriver", options);
} else {
    collection = db.getCollection("cappedLogsJavaDriver");
}

创建集合后,我们可以将文档插入其中以确保其按预期工作。 以下代码段显示了如何将8个文档插入到集合中(请记住,由于这是一个有上限的集合,因此将仅存储其中的最后5个)。

for (int i = 0; i < 8; i++) {
    BasicDBObject logEntry = new BasicDBObject("logId", i);
    collection.insert(logEntry);
}

使用MongoDB交互式外壳,我们可以验证现在存储在集合中的文档是否符合预期。

> db.cappedLogsJavaDriver.find()
{ "_id" : ObjectId("54a1ca44a82617da4f72e025"), "logId" : 3 }
{ "_id" : ObjectId("54a1ca44a82617da4f72e026"), "logId" : 4 }
{ "_id" : ObjectId("54a1ca44a82617da4f72e027"), "logId" : 5 }
{ "_id" : ObjectId("54a1ca44a82617da4f72e028"), "logId" : 6 }
{ "_id" : ObjectId("54a1ca44a82617da4f72e029"), "logId" : 7 }
摩菲亚

现在,我们已经了解了如何通过Java驱动程序创建集合,让我们看看如何使用Morphia来完成相同的事情。

Morphia的本质是将Java类映射到MongoDB或从MongoDB映射。 我们希望保留在MongoDB中的类使用@Entity注释进行注释,然后将其存储在通常以该类进行命名的集合中。 要创建一个有上限的集合,我们必须在@Entity注释上添加其他值,以指定集合中的最大条目数和集合的大小。 对与Java驱动程序示例中使用的对象类型相同的对象进行建模,我们将创建一个LogEntry类,如下所示:

@Entity(value="cappedLogsMorphia", cap=@CappedAt(count=5, value=4096))
public class LogEntry {

    private int logId;

    @Id
    private ObjectId id;

    public LogEntry(int logId) {
        this.logId = logId;
    }

    public int getLogId() {
        return logId;
    }

    public void setLogId(int logId) {
        this.logId = logId;
    }
}

我们可以看到该类以@Entity注释,指定该集合最多应包含5个文档和4096字节的大小。

使用Morphia,可以在启动时通过调用Morphia Datastore上的.ensureCaps .ensureCaps()方法来创建有上限的集合,如下所示。

MongoClient mongoClient = new MongoClient(new MongoClientURI("mongodb://localhost"));
DB db = mongoClient.getDB("test");

Morphia morphia = new Morphia();
morphia.map(LogEntry.class);

Datastore datastore = morphia.createDatastore(mongoClient, "test");
datastore.ensureCaps();

再次,和以前一样,我们可以将8个文档插入到集合中以验证仅存储了最后5个文档。

for (int i = 0; i < 8; i++) {
    LogEntry logEntry = new LogEntry(i);
    datastore.save(logEntry);
}
> db.cappedLogsMorphia.find()
{ "_id" : ObjectId("54a1ce9da82629642c64f5d9"), "className" : "com.davidsalter.cappedcollection.LogEntry", "logId" : 3 }
{ "_id" : ObjectId("54a1ce9da82629642c64f5da"), "className" : "com.davidsalter.cappedcollection.LogEntry", "logId" : 4 }
{ "_id" : ObjectId("54a1ce9da82629642c64f5db"), "className" : "com.davidsalter.cappedcollection.LogEntry", "logId" : 5 }
{ "_id" : ObjectId("54a1ce9da82629642c64f5dc"), "className" : "com.davidsalter.cappedcollection.LogEntry", "logId" : 6 }
{ "_id" : ObjectId("54a1ce9da82629642c64f5dd"), "className" : "com.davidsalter.cappedcollection.LogEntry", "logId" : 7 }
检查收集状态

在MongoDB中创建一个有上限的集合后,我们可以通过在Mongo DB交互式外壳程序中对该集合执行.stats()方法来检查其状态。

> db.cappedLogsJavaDriver.stats()
{
    "ns" : "test.cappedLogsJavaDriver",
    "count" : 5,
    "size" : 180,
    "avgObjSize" : 36,
    "storageSize" : 4096,
    "numExtents" : 1,
    "nindexes" : 1,
    "lastExtentSize" : 4096,
    "paddingFactor" : 1,
    "systemFlags" : 1,
    "userFlags" : 0,
    "totalIndexSize" : 8176,
    "indexSizes" : {
        "_id_" : 8176
    },
    "capped" : true,
    "max" : 5,
    "ok" : 1
}

在这里,我们可以看到集合确实有上限(“ capped” = true),并且集合中的最大条目数为5(“ max” = 5)。

本文中使用的示例的源代码可以在GitHub上找到 。

翻译自: https://www.javacodegeeks.com/2015/03/creating-a-mongodb-capped-collection-in-java.html

mongodb上限集合