【发布时间】:2017-01-13 10:16:35
【问题描述】:
我对 MongoDB 很陌生。我对 MongoDB 进行了“粗略”的操作。
我想在 MongoDB 中使用事件功能,即当数据插入 MongoDB 集合事件时,应该发生 数据应该立即由 MongoDB 本身在 UI 上发出。
这在 MongoDB 中可行吗?
如果是,那么如何?如果不是,那为什么?
提前致谢。
【问题讨论】:
标签: java angularjs mongodb jsp spring-boot
我对 MongoDB 很陌生。我对 MongoDB 进行了“粗略”的操作。
我想在 MongoDB 中使用事件功能,即当数据插入 MongoDB 集合事件时,应该发生 数据应该立即由 MongoDB 本身在 UI 上发出。
这在 MongoDB 中可行吗?
如果是,那么如何?如果不是,那为什么?
提前致谢。
【问题讨论】:
标签: java angularjs mongodb jsp spring-boot
您可以将tailable cursor 与Bytes.QUERYOPTION_AWAITDATA 选项一起使用。 Mongodb 的可尾游标文档:https://docs.mongodb.com/manual/core/tailable-cursors/
... 在客户将新的附加文档插入到一个封顶后 集合,可尾游标将继续检索文档。
当您使用不满足的查询检索文档时,将返回一个空游标。然后,当您调用cur.hasNext() 时,它会等待数据出现(有超时):
mongoTemplates.createCollection("model", new CollectionOptions(null, 10, true));
DBObject query = new BasicDBObject("value", "val");
DBCursor cur = mongoTemplates.getCollection("model")
.find(query)
.addOption(Bytes.QUERYOPTION_TAILABLE)
.addOption(Bytes.QUERYOPTION_AWAITDATA);
new Thread() {
public void run() {
//cur.hasNext will wait for data
while (cur.hasNext()) {
DBObject obj = cur.next();
System.out.println(obj);
}
};
}.start();
cursor.hasNext() 将解除阻塞:db.model.insertOne({value: "val"})
为此,必须使用“capped”选项创建集合:
在java中:mongoTemplates.createCollection("model", new CollectionOptions(MAX_SIZE_BYTES, MAX_NB_DOCUMENTS, IS_CAPPED));
在 mongo 客户端中:db.createCollection( "model", { capped: true, size: 10 } )
Capped Collection 解释在documentation:
默认情况下,MongoDB 会在客户端自动关闭游标 已用尽游标中的所有结果。但是,对于 上限 集合,您可以使用保持打开状态的Tailable Cursor 在客户端用完初始游标中的结果后。
【讨论】: