Home > Enterprise >  Mongo Bulkwrite with $addToSet
Mongo Bulkwrite with $addToSet

Time:10-12

I have been trying a bulkwrite but get complained about typing (I think it's about the syntax):

        Type '{ roles: string; }' is not assignable to type 'SetFields<any>'.
          Type '{ roles: string; }' is not assignable to type 'NotAcceptedFields<any, readonly any[]>'.
            Property 'roles' is incompatible with index signature.
              Type 'string' is not assignable to type 'never'.ts(2345)

I can't find any examples or docs about using $addToSet in a builkwrite. Here it is (INTER_ADMINS is just an array of string):

const bulkUpdates = INTER_ADMINS.map((ethAddress) => {
    return {
      updateOne: {
        filter: { ethAddress },
        update: {
          $addToSet: {
            roles: 'INTERNAL_ADMIN',
          },
        },
        upsert: true,
      },
    };
  });

  
  const res = await db.collection('users').bulkWrite(bulkUpdates);

users collection sample:

{
   ethAddress: 'something',
   roles: ['role1','role2']
}

Appreciate your help

CodePudding user response:

The syntax is correct, this is just a typescript error. I recommend you just add a @ts-ignore and move on.

Here is the type definition:

export type UpdateQuery<TSchema> = {
    ....
    $addToSet?: SetFields<TSchema> | undefined;
    ....
};
export type SetFields<TSchema> = ({
    readonly [key in KeysOfAType<TSchema, ReadonlyArray<any> | undefined>]?:
        | UpdateOptionalId<Unpacked<TSchema[key]>>
        | AddToSetOperators<Array<UpdateOptionalId<Unpacked<TSchema[key]>>>>;
} &
    NotAcceptedFields<TSchema, ReadonlyArray<any> | undefined>) & {
    readonly [key: string]: AddToSetOperators<any> | any;
};

As you can see because the Schema is not provided typescript doesn't know which are the valid "keys" of the schema so the only valid type left in the SetFields is the NotAcceptedFields fields type (which are null and undefined, not string )

If you provide a Schema to the operations I believe it should sort the issue:

const bulkUpdates: BulkWriteOperation<UserSchema>[]  = ...
  • Related