1

根据mongodb changestream的文档,我可以查看集合中特定字段的更新:

const changeStream = collection.watch(
[{
  $match: {
    $and: [
      { "updateDescription.updatedFields.a": { $exists: true } },
      { operationType: "update" }
    ]
  }
}],
{
  fullDocument: "updateLookup"
}
);

我想知道,如何用 spring data mongodb reactive 实现同样的事情。

当我用

Flux<ChangeStreamEvent<TestObject>> changeStream = 
mongoTemplate.changeStream(
        newAggregation(
            match(
                where("operationType").is("update")
                    .and("updateDescription").exists(true)
            )
        ),
        TestObject.class,
        ChangeStreamOptions.empty(),
        "testObject"
    );

我得到所有更新。这些更改事件之一的日志如下所示:

ChangeStreamEvent {
raw=ChangeStreamDocument{
    resumeToken={ "_data" : { "$binary" : "glsU9sYAAAATRmRfaWQAZFsU9sayZFockO0phgBaEATGaP42X4VI+4SrTyscwRtsBA==", "$type" : "00" } },
    namespace=test.testObject, 
    fullDocument=Document{{_id=5b14f6c6b2645a1c90ed2986, a=a, b=b, _class=com.example.demo.TestObject}}, 
    documentKey={ "_id" : { "$oid" : "5b14f6c6b2645a1c90ed2986" } }, 
    clusterTime=null, 
    operationType=OperationType{value='update'}, 
    updateDescription=UpdateDescription{removedFields=[], updatedFields={ "b" : "b" }}}, 
    targetType=class com.example.demo.TestObject
    }

但是,当我将过滤器更改为

newAggregation(
            match(
                where("operationType").is("update")
                    .and("updateDescription.updatedFields").exists(true)
            )
        )

或者

newAggregation(
            match(
                where("operationType").is("update")
                    .and("updateDescription.updatedFields.b").exists(true)
            )
        )

我没有改变事件。所以这里有一个问题:我如何定义 Criteria 以匹配updatedField.b上的更新?

集合中的示例文档是:

{
  "_id" : ObjectId("5b14f049b2645a4a24b33df1"),
  "a" : "va",
  "b" : "vb",
  "_class" : "com.example.demo.TestObject"
}

第一个“工作”过滤器的示例可以在以下位置下载: 我的测试 github repo

4

0 回答 0