我正在编写一个进程,该进程每1小时运行一次,并连接到mongodb集合。 CollectionA中的文档具有关联的时间戳记密钥。然后,该过程必须搜索在我们之前获得的时间戳之后插入到另一个集合B中的所有新文档。

集合A-(只有1个documnet,可以节省时间戳记)
_id:属性
时间戳:ISODate(“ 2019-02-13T06:44:45.387Z”)

集合B-(具有多个可随时更新的文档)
但是它没有时间戳字段。

我必须从集合A中选择“时间戳”,并从集合B中检索在该时间戳之后添加的所有那些文档。

最佳答案

从collectionA查找最后一个时间戳
将时间戳弹出到fakeObjectId中
{ _id: { $gt: fakeObjectId} }查询collectionB


这个想法来自this answer,objectId包含文档创建时间,因此我们可以弹出一个假的objectId作为查询过滤器。

下面的演示代码:

public class MongoTest {
    public static void main(String[] args) {
        MongoClient client = MongoClients.create();
        MongoDatabase testDb = client.getDatabase("test");
        MongoCollection<Document> collectionA = testDb.getCollection("test");
        MongoCollection<Document> collectionB = testDb.getCollection("runoob");

        Document first = collectionA.find().first();
        Date lastOptTime = first.getDate("lastOptTime");

        ObjectId fakeObjectId = objectIdFromDate(lastOptTime);

        FindIterable<Document> documents =
                collectionB.find(Filters.gte("_id", fakeObjectId));
        for (Document document : documents) {
            System.out.println(document);
        }
    }

    public static ObjectId objectIdFromDate(Date date) {
        long second = date.getTime() / 1000;
        return new ObjectId(String.format("%02x", second) + "0000000000000000");
    }
}

08-04 18:38