我正在用MongoDB作为数据存储创建一种后台作业队列系统。在生成工人处理作业之前,我如何“监听”MongoDB集合的插入?
是否需要每隔几秒钟轮询一次,以查看与上次相比是否有任何更改,或者是否有一种方法可以让脚本等待插入的发生?
这是一个PHP项目,我正在工作,但请随意回答在Ruby或语言不可知。
我正在用MongoDB作为数据存储创建一种后台作业队列系统。在生成工人处理作业之前,我如何“监听”MongoDB集合的插入?
是否需要每隔几秒钟轮询一次,以查看与上次相比是否有任何更改,或者是否有一种方法可以让脚本等待插入的发生?
这是一个PHP项目,我正在工作,但请随意回答在Ruby或语言不可知。
当前回答
在3.6允许使用数据库之后,以下数据库触发类型:
事件驱动触发器——用于自动更新相关文档、通知下游服务、传播数据以支持混合工作负载、数据完整性和审计 计划触发器——对于计划数据检索、传播、归档和分析工作负载非常有用
登录到您的Atlas帐户,选择触发器界面,并添加新的触发器:
展开每个部分以了解更多设置或详细信息。
其他回答
自从MongoDB 3.6以来,会有一个新的通知API叫做Change Streams,你可以使用它。有关示例,请参阅这篇博客文章。例子如下:
cursor = client.my_db.my_collection.changes([
{'$match': {
'operationType': {'$in': ['insert', 'replace']}
}},
{'$match': {
'newDocument.n': {'$gte': 1}
}}
])
# Loops forever.
for change in cursor:
print(change['newDocument'])
实际上,与其观察输出,不如使用mongoose schema提供的中间件在插入新内容时注意到它
您可以捕捉插入新文档的事件,并在插入完成后执行一些操作
看看这个:改变流
2018年1月10日——3.6版
*编辑:我写了一篇关于如何做到这一点的文章https://medium.com/riow/mongodb-data-collection-change-85b63d96ff76
https://docs.mongodb.com/v3.6/changeStreams/
这是mongodb 3.6中的新功能 https://docs.mongodb.com/manual/release-notes/3.6/ 2018/01/10
$ mongod --version
db version v3.6.2
为了使用changeStreams,数据库必须是一个复制集
关于复制集的更多信息: https://docs.mongodb.com/manual/replication/
默认情况下,数据库将是“独立的”。
如何将一个独立的副本集:https://docs.mongodb.com/manual/tutorial/convert-standalone-to-replica-set/
下面的示例是一个实际应用程序,说明如何使用它。 *特别针对Node。
/* file.js */
'use strict'
module.exports = function (
app,
io,
User // Collection Name
) {
// SET WATCH ON COLLECTION
const changeStream = User.watch();
// Socket Connection
io.on('connection', function (socket) {
console.log('Connection!');
// USERS - Change
changeStream.on('change', function(change) {
console.log('COLLECTION CHANGED');
User.find({}, (err, data) => {
if (err) throw err;
if (data) {
// RESEND ALL USERS
socket.emit('users', data);
}
});
});
});
};
/* END - file.js */
有用的链接: https://docs.mongodb.com/manual/tutorial/convert-standalone-to-replica-set https://docs.mongodb.com/manual/tutorial/change-streams-example
https://docs.mongodb.com/v3.6/tutorial/change-streams-example http://plusnconsulting.com/post/MongoDB-Change-Streams
在3.6允许使用数据库之后,以下数据库触发类型:
事件驱动触发器——用于自动更新相关文档、通知下游服务、传播数据以支持混合工作负载、数据完整性和审计 计划触发器——对于计划数据检索、传播、归档和分析工作负载非常有用
登录到您的Atlas帐户,选择触发器界面,并添加新的触发器:
展开每个部分以了解更多设置或详细信息。
MongoDB 3.6版现在包含了变更流,它本质上是OpLog之上的API,允许触发/通知类用例。
下面是一个Java示例的链接: http://mongodb.github.io/mongo-java-driver/3.6/driver/tutorials/change-streams/
一个NodeJS的例子可能是这样的:
var MongoClient = require('mongodb').MongoClient;
MongoClient.connect("mongodb://localhost:22000/MyStore?readConcern=majority")
.then(function(client){
let db = client.db('MyStore')
let change_streams = db.collection('products').watch()
change_streams.on('change', function(change){
console.log(JSON.stringify(change));
});
});