Search code examples
javascriptmongodbmongoosechangestream

how to catch mongo change streams when one key in object gets updated


I am using the mongo change stream to update some of my data in the cache. This is the Documentation i am following.

I want to know when one of the keys in my object gets updated.

Schema :- attributes: { position: { type: Number } },

How will I come to know when the position will get updated?

This is how my updateDescription object looks like after updation

updateDescription = {
    updatedFields: { 'attributes.position': 1, randomKey: '1234'},
    removedFields: []
  }

Tried this and its not working

Collection.watch(
  [
    {
      $match: {
        $and: [
          { operationType: { $in: ['update'] } },
          {
            $or: [
              { 'updateDescription.updatedFields[attributes.position]': { $exists: true } },
            ],
          },
        ],
      },
    },
  ],
  { fullDocument: 'updateLookup' },
);

Solution

  • I was able to fix it like this,

    const streamUpdates = <CollectionName>.watch(
      [
        {
          $project:
            {
              'updateDescription.updatedFields': { $objectToArray: '$updateDescription.updatedFields' },
              fullDocument: 1,
              operationType: 1,
            },
        },
        {
          $match: {
            $and: [
              { operationType: 'update' },
              {
                'updateDescription.updatedFields.k': {
                  $in: [
                    'attributes.position',
                  ],
                },
              },
            ],
          },
        },
      ],
      { fullDocument: 'updateLookup' },
    );
    

    and then do something with the stream

    streamUpdates.on('change', async (next) => {
        //your logic 
    });
    

    Read more here MongoDB