1

我正在尝试使用 MongoDB java SDK 在集合名称上使用管道过滤器设置部署级别更改流。这是代码片段。

   List<Bson> pipeline = Collections.singletonList(Aggregates.match(Filters.or(
        Filters.eq("namespace", "db1.c1"),
        Filters.eq("namespace", "db1.c2"))));
 
    client.watch(pipeline)
        .cursor()
        .forEachRemaining(doc -> {
          System.out.println(doc);
        });

但是这个查询不匹配任何文档。以下管道文档的变体也不起作用。

    List<Bson> pipeline =
    Collections.singletonList(Aggregates.match(Filters.or(
      Document.parse("{'namespace': 'db1.c1'}"),
      Document.parse("{'namespace': 'db1.c2'}")))); 

令人惊讶的是,管道适用于变更流文档的其他领域。例如,这有效:

     List<Bson> pipeline = Collections
     .singletonList(Aggregates.match(Filters.and(
     Document.parse("{'fullDocument.seq': 4}"),
     Filters.in("operationType", Arrays.asList("insert")))));

我不确定为什么会这样。我将不胜感激在这方面的任何帮助。

4

1 回答 1

0

为了获得数据库或集合级别的变更流事件,您需要在以下属性上使用过滤器:

ns.db 数据库的名称。

ns.coll集合的名称。

在您的情况下,如果您只对集合 C1 和 c2 感兴趣,请考虑使用类似下面的过滤器。

List<Bson> pipeline = Collections.singletonList(Aggregates.match(Filters.or(
            Filters.eq("ns.coll", "c1"),
            Filters.eq("ns.coll", "c2"))));
     
        client.watch(pipeline)
            .cursor()
            .forEachRemaining(doc -> {
              System.out.println(doc);
            });

请注意:以上过滤器仅适用于集合,您可以在数据库上添加过滤器以获取特定于集合的数据库,例如 (ns.db = "db1" AND ns.coll : $in :["c1", "c2"] )

MongoDB 文档参考: https ://docs.mongodb.com/manual/reference/change-events/#change-stream-output

于 2020-09-25T22:37:11.493 回答