如何根据在另一个容器中执行的 insert/update,利用 Cosmos DB 中的 Change Feed 对一个容器中的 insert/update 进行更改?

How can use you leverage Change Feed in Cosmos DB to insert/update in one container based on the insert/update performed in another container?

假设在 CustomerContainer 中有一个文档,其中包含客户的详细信息,例如以下

    { 
       "customerId":"929607CC-454F-44A3-B77A-9893044EC2A",
       "entityType":"Customer",
       "customerCode":"1234",
       "email":"abd@gmail.com",
       "firstName":"Tripty",
       "lastName":"Chauhan",
       "phoneNumber":"935465664",
       "address1":"Tithal Road",
       "address2":"Valsad",
       "zipcode":"3567",
       "createdDate":"2019-09-15T23:14:25.7251173Z"
    }   

还有另一个包含车辆文档的 VehicleCollection,

    { 
       "vehicleId":"9CAB9D21-BF41-42D3-90B3-910C0B607429",
       "entityType":"Vehicle",
       "VIN":"FDFGH89GFDGFD09193209",
       "partialVIN":"193209",
       "vehicleDetailId":"38CBEAF7-5858-4EED-8978-E220D2BA745E",
       "make":{ "Id":"B57ADAAD-C16E-44F9-A05B-AAB3BF7068B9","make":"BMW"},
          "model":{ 
             "Id":"2F4D4D7F-2B10-48D6-A432-3DEA445D64E5",
             "model":"ABDS"
          },
          "trim":{ 
             "Id":"2AC50FE4-4B1C-4034-AD29-51028B96FF6F",
             "trim":"5.6L/ASMD"
          },
          "year":{ 
             "Id":"81B5859D-F953-44C5-BB86-D41FE11086B3",
             "year":2008
          },
       "createdDate":"2019-09-15T23:14:25.7251173Z"
       }

VehicleConatiner 还包含映射 Vehicle 和 Customer 的文档。

我想在 VehicleContainer 中添加新车辆文档时在 CustomerVehicle 文档中执行插入操作,并在修改现有客户文档时执行更新操作。

    { 
       "customerVehicleId":" 5F214745-B400-4D8E-9F97-D1FEBFDD079E",
       "entityType":"VehicleCustomer",
       "vehicleId":"9CAB9D21-BF41-42D3-90B3-910C0B607429",
       "customerId":" 929607CC-454F-44A3-B77A-9893044EC2A",
       "VIN":" FDFGH89GFDGFD09193209",
       "firstName":"Tripty",
       "lastName":"Chauhan",
       "customerType":1,
       "email":"tripty@gmail.com",
       "phoneNumber":"978576575",
       "createdDate":"2019-09-15T23:14:25.7251173Z"
    }

目前,Change Feed 不区分插入和更新,因此您需要在 VehicleCollection 中有一些字段,您可以利用它来区分一个场景和另一个场景。它可能会添加一个 createdTime 作为您可以比较的纪元。

要消费 Change Feed,您可以:

  • 使用 Change Feed Processor 创建和托管您的应用程序。由于这已经是客户端 SDK 的一部分,因此您拥有所有需要的工具,可以根据需要进行查询和保存。
  • 利用 Azure Functions Cosmos DB Trigger to create an Azure Function that will wake up and start whenever there are changes. To save changes in another collection you can use the Cosmos DB Output Binding to either just save documents or if you need to do a mix of querying and saving, you can obtain the client instance 并执行操作。

无论选择哪种方式,在这两种情况下您都会收到更改列表并且您必须应用一些逻辑来识别哪些是插入哪些是更新,并采取相应的行动。