我正在尝试在调度应用程序中使用 Mongoose 及其查询流,但我可能误解了它的工作原理。我已经在 SO [ Mongoose QueryStream new results 上阅读了这个问题。看来我是对的,但有人请解释一下:
如果我像这样过滤查询 -
Model.find().stream()
当我添加或更改与 .find() 匹配的内容时,它应该会引发一个 data 事件,对吗?还是我对这个问题的理解完全错误?
例如,我正在尝试查看一些数据:
Events.find({'title':/^word/}).stream();
我正在 mongodb 控制台中更改标题,但没有看到任何更改。
谁能解释一下为什么?
最佳答案
您的理解确实不正确,因为流只是当前查询响应的输出流,而不是“监听新数据”本身。这里返回的结果基本就是一个 Node streaming interface ,这是一个可选的选择,而不是“游标”,或者实际上是像 mongoose 方法默认那样直接转换为数组。
所以“流”不只是“跟随”任何东西。这实际上只是处理查询的正常结果的另一种方式,但不会立即将所有结果“吞噬”到内存中。它使用事件监听器来处理从服务器游标获取的每个结果。
你说的其实是一个"tailable cursor" ,或其某些变体。在基本的 MongoDB 操作中,可以在 capped collection 上实现“tailable 游标” .这是一种具有特定规则的特殊类型的集合,因此它可能不适合您的目的。它们旨在用于通常适用于事件队列的“仅插入”操作。
在使用上限集合的模型上(并且仅在设置了上限集合的地方)然后您可以这样实现:
var query = Events.find({'title':/^word/}).sort({ "$natural": -1}).limit(1);
var stream = query.tailable({ "awaitdata": true}).stream();
// fires on data received
stream.on("data",function(data) {
console.log(data);
});
“awaitdata”与“tailable”选项本身一样重要,因为它是告诉查询游标保持“事件”和“尾部”满足查询条件。但是您的收藏必须设置“上限”才能生效。
另一种更高级的方法是执行类似 meteor 的操作分发确实如此,其中被跟踪的“上限集合”实际上是 MongoDB oplog .这需要 replica set配置,但是就像 meteor 开箱即用一样,将单个 Node 作为副本集本身并没有错。在生产中这样做是不明智的。
这比简单的答案更高级,但基本概念是因为“oplog”是一个上限集合,您可以为数据库上的所有写操作“尾部”它。然后检查此事件数据以确定您要监视写入的集合等详细信息。然后,该数据可用于查询新信息并执行某些操作,例如通过 websocket 或类似方式将更新或新结果返回给客户端。
但是流本身就是流。要“跟踪”集合上的更改,您需要将其实现为上限,或者考虑实现一个基于观察 oplog 中所述更改的流程。
关于node.js - MongoDb + Mongoose QueryStream - 以下文档更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31735870/
如何正确创建Rails迁移,以便将表更改为MySQL中的MyISAM?目前是InnoDB。运行原始执行语句会更改表,但它不会更新db/schema.rb,因此当在测试环境中重新创建表时,它会返回到InnoDB并且我的全文搜索失败。我如何着手更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库得到相应更新? 最佳答案 我没有找到执行此操作的好方法。您可以像有人建议的那样更改您的schema.rb,然后运行:rakedb:schema:load,但是,这将覆盖您的数据。我的做法是(假设
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我尝试使用不同的ssh_options在同一阶段运行capistranov.3任务。我的production.rb说:set:stage,:productionset:user,'deploy'set:ssh_options,{user:'deploy'}通过此配置,capistrano与用户deploy连接,这对于其余的任务是正确的。但是我需要将它连接到服务器中配置良好的an_other_user以完成一项特定任务。然后我的食谱说:...taskswithoriginaluser...task:my_task_with_an_other_userdoset:user,'an_othe
假设我有一个FireNinja我的数据库中的对象,使用单表继承存储。后来才知道他真的是WaterNinja.将他更改为不同的子类的最干净的方法是什么?更好的是,我很想创建一个新的WaterNinja对象并替换旧的FireNinja在数据库中,保留ID。编辑我知道如何创建新的WaterNinja来self现有FireNinja的对象,我也知道我可以删除旧的并保存新的。我想做的是改变现有项目的类别。我是通过创建一个新对象并执行一些ActiveRecord魔法来替换行,还是通过对对象本身做一些疯狂的事情,或者甚至通过删除它并使用相同的ID重新插入来做到这一点,这是问题的一部分。
matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功