【问题标题】:NodeJS - MongoDB triggersNodeJS - MongoDB 触发器
【发布时间】:2012-09-14 03:09:19
【问题描述】:

我正在尝试使用 DerbyJS、Racer 和 MongoDB 开发日志查看器。日志会不断地被不同的来源插入到 MongoDB 数据库中,我的日志查看器应该能够自动更新用户界面上的日志表。

我想知道是否有监听 MongoDB 事件的本地方式,例如:

 - On update
 - On delete

这些将类似于,例如,Oracle DB 触发器。

【问题讨论】:

  • 我的回答对你有帮助吗?

标签: node.js mongodb derbyjs


【解决方案1】:

您可以使用名为oplog 的特殊集合在mongodb 中侦听insertupdate 等事件以及其他数据事件。您只需使用mongod --mastermongod --replicaSet 在您的数据库实例上启用复制。

Oplog 实际上是一个 capped 集合,mongodb 内部使用它来实现复制。如果您使用主/从复制,您将找到名称为oplog.$main 的集合,如果您使用的是副本集,它将被命名为oplog.rs

您可以在 oplog 上使用可尾光标,应该可以。

Oplog 实际上就是日志本身。因此,您可能不需要单独存储它们以用于记录目的。但是它的大小是固定的。这意味着当其完整的旧数据被删除时。

还要确保您正在查看 local 数据库,这是维护 oplog 的地方

这是来自mongoskin wiki page的工作示例

skin = require "mongoskin"
db = skin.db "localhost:27017/local"

#//Cursor on oplog (a capped collection) which maintains a history for replication
#//oplog can be used only when replication is enabled
#//Use oplog.rs instead of oplog.$main if you are using replica set

oplog = db.collection "oplog.$main"
cursor = oplog.find({'ns': "icanvc.projects"},{tailable: yes, awaitData: yes})

#//Using cursor.nextObject will be slow
cursor.each (err, log)->
    console.error err if err
    console.log log if not err

【讨论】:

    【解决方案2】:

    日志查看器应用程序的典型方法是使用tailable cursorcapped collection 的日志条目。

    【讨论】:

    • 谢谢,我会试试看是否能达到目的:) 同时我会提供反馈。你认为我需要有上限的集合来完成这项工作吗?要给出触发效果,还是我可以只使用可尾光标?
    • 是的,tailable cursors 只能用于 capped 集合。
    【解决方案3】:

    不,https://jira.mongodb.org/browse/SERVER-124 必须是应用程序端。

    我不确定 node.js 是否在其驱动程序中内置了 MongoDB 触发器,但很可能没有,因此您需要自己编写代码。

    【讨论】:

    • 我没有。我用错了触发器的定义。我的意思不是你说的,在数据​​库更改时更新应用程序,但它必须是查询数据库的应用程序。真的不能反过来。
    • Mongodb 中没有未解决的 [issue|feature|buq|problem] 的日子不是同一天 :) 第一次回复日期:14/Jul/09
    猜你喜欢
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 2016-01-30
    • 2020-01-28
    • 1970-01-01
    相关资源
    最近更新 更多