Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Ruby MongoDB驱动程序客户端查询匹配器_Javascript_C_Ruby_Mongodb - Fatal编程技术网

Javascript Ruby MongoDB驱动程序客户端查询匹配器

Javascript Ruby MongoDB驱动程序客户端查询匹配器,javascript,c,ruby,mongodb,Javascript,C,Ruby,Mongodb,我正在使用WebSockets在Ruby中构建一个系统,它将通知JS客户端对集合的更改,这些更改适用于JS客户端正在查看的模型和集合。我希望JS客户端定期向WebSocket发送注册消息,告诉它当前正在查看的模型,以及查询指定的集合或集合子集 因此,为了实现这一点,承载WebSocket服务器的API需要测试查询是否与已更新/创建的文档匹配。我希望在不向Mongo发送查询的情况下执行此操作,我在C驱动程序中找到了一个可以在Mongo客户端工作的解决方案: 不幸的是,我没有看到通过Ruby驱动程

我正在使用WebSockets在Ruby中构建一个系统,它将通知JS客户端对集合的更改,这些更改适用于JS客户端正在查看的模型和集合。我希望JS客户端定期向WebSocket发送注册消息,告诉它当前正在查看的模型,以及查询指定的集合或集合子集

因此,为了实现这一点,承载WebSocket服务器的API需要测试查询是否与已更新/创建的文档匹配。我希望在不向Mongo发送查询的情况下执行此操作,我在C驱动程序中找到了一个可以在Mongo客户端工作的解决方案:


不幸的是,我没有看到通过Ruby驱动程序调用此方法的方法。有没有线索告诉我如何在Ruby中使用mongoc_matcher_新函数?或者有人有更好的建议来改进此解决方案的体系结构,只向JS客户端发送适用的更新吗?

我认为,如果不查询Mongo,您将无法做到这一点。实现这一点的标准方法是跟踪oplog,但oplog只会给您提供数据库/集合和_id。因此,我认为您无法仅使用oplog支持任意查询,您需要获取文档以确定匹配


我建议你看看这是怎么回事。本文概述了他们的方法。还有一个更详细的说明。

我最终使用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;
}
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