Cycl0n3
Cycl0n3

Reputation: 697

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' },
);

Upvotes: 0

Views: 628

Answers (1)

Raj Chandra
Raj Chandra

Reputation: 120

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

Upvotes: 2

Related Questions