我正在编写一个进程,该进程每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");
}
}