我正在使用WebSockets在Ruby中构建一个系统,该系统将通知JS客户端对适用于模型的集合的更改。 JS客户端正在查看的集合。我想让JS客户端定期向WebSocket发送注册消息,告诉它当前正在查看的模型,以及集合(或查询指定的集合子集)。
因此,为了使这项工作,托管WebSocket服务器的API将需要测试查询是否与已更新/创建的文档匹配。我想这样做而不向Mongo发送查询,我在C驱动程序中找到了一个可以在(mongo)客户端工作的解决方案:http://api.mongodb.org/c/current/mongoc_matcher_new.html http://api.mongodb.org/c/current/matcher.html
不幸的是,我没有看到通过Ruby驱动程序调用此方法的方法。有什么线索我可以在Ruby中使用mongoc_matcher_new函数吗?或者有没有人有更好的建议来改进这个解决方案的架构,只向JS客户端发送适用的更新?
答案 0 :(得分:0)
我不认为你可以在不回询Mongo的情况下做到这一点。执行此操作的标准方法是通过拖尾oplog,但oplog只会为您提供数据库/集合和_id。因此,我认为您只能使用oplog支持任意查询,您需要获取文档以确定匹配。
我建议你看看Meteor如何做到这一点。这个blog post概述了他们的方法。 wiki page上还有OplogObserveDriver具有更多细节。
答案 1 :(得分:0)
我最终使用FFI来运行我需要的代码:
MongoC.test_query_match(document_string, json_query_string)
C代码:
#include <bcon.h>
#include <mongoc.h>
#include <stdio.h>
int test_query_match(char *document, char *query) {
mongoc_matcher_t *matcher;
bson_t *d;
bson_t *q;
bson_error_t doc_parse_error;
bson_error_t query_parse_error;
bson_error_t matcher_error;
d = bson_new_from_json(document, strlen(document), &doc_parse_error);
q = bson_new_from_json(query, strlen(query), &query_parse_error);
matcher = mongoc_matcher_new(q, &matcher_error);
if ( !matcher ) {
bson_destroy(q);
bson_destroy(d);
return 0;
}
int match = mongoc_matcher_match(matcher, d);
bson_destroy(q);
bson_destroy(d);
mongoc_matcher_destroy(matcher);
return match;
}
Ruby FFI代码:
require 'ffi'
module MongoC
extend FFI::Library
ffi_lib 'c'
ffi_lib File.dirname(__FILE__) + '/mongoc/mongoc.so'
attach_function :test_query_match, [:string, :string], :int
end