В соответствии с документацией файла изменений mongodb, я могу следить за обновлениями в определенных полях сбора:
const changeStream = collection.watch(
[{
$match: {
$and: [
{ "updateDescription.updatedFields.a": { $exists: true } },
{ operationType: "update" }
]
}
}],
{
fullDocument: "updateLookup"
}
);
Я хотел бы знать, как добиться того жевещь с пружинными данными mongodb реактив.
Когда я создаю поток изменений с
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)
)
)
, я не получаюизменить события.Итак, вот вопрос: как я могу определить Критерии для соответствия обновлений на updatedField.b ?
Пример документа из коллекции:
{
"_id" : ObjectId("5b14f049b2645a4a24b33df1"),
"a" : "va",
"b" : "vb",
"_class" : "com.example.demo.TestObject"
}
Пример с первым «рабочим» фильтром можно скачать по адресу: my test github repo