Dynamoose - не может запросить и где с 2 ключами - PullRequest
0 голосов
/ 22 сентября 2018

Я открыл связанную проблему на GitHub, но, возможно, кто-то здесь сможет помочь быстрее.

Резюме:

ValidationException: Query key condition not supported Мне нужно найти записи в последнем (количество)секунд в данном месте.Довольно просто, но уже связано с другими проблемами: Один и Другой

РАБОТАЕТ :

Activity.query('locationId').eq(locationId).exec();

НЕ РАБОТАЕТ :

Activity.query('locationId').eq(locationId).where('createdAt').ge(date).exec();

Пример кода:

Схема
const Activity = (dynamoose: typeof dynamooseType) => dynamoose.model<ActivityType, {}>('Activity',
    new Schema({
      id: {
        type: String,
        default: () => {
          return uuid();
        },
        hashKey: true,
      },
      userId: {
        type: String,
      },
      locationId: {
        type: String,
        rangeKey: true,
        index: {
          global: true,
        },
      },
      createdAt: { type: Number, rangeKey: true, required: true, default: Date.now },
      action: {
        type: Number,
      },
    }, {
      expires: 60 * 60 * 24 * 30 * 3, //  activity logs to expire after 3 months
    }));
Код, который выполняет функцию

Забавная частьзаключается в том, что я нашел это как обходной путь, предложенный для использования до тех пор, пока они не объединят PR, предоставляя возможность указывать метки времени в качестве ключей, но, к сожалению, это не работает.

async getActivitiesInLastSeconds(locationId: string, timeoutInSeconds: number) {
    const Activity = schema.Activity(this.dynamoose);
    const date = moment().subtract(timeoutInSeconds, 'seconds').valueOf();
    return await Activity.query('locationId').eq(locationId)
      .where('createdAt').ge(date).exec();
  }

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

Я почти уверен, что проблема в том, что когда вы указываете rangeKey: true в свойстве createdAt, вы говорите, что оно будет использоваться в глобальном индексе (я не думаю, что это правильный термин).Этот ключ диапазона будет связан со свойством id.

Я считаю, что самым простым решением было бы изменить индекс locationId на что-то вроде следующего:

index: {
    global: true,
    rangeKey: 'createdAt',
},

Токак вы очень четко указываете, какой индекс вы хотите установить createdAt в качестве rangeKey для.

После внесения этого изменения, пожалуйста, не забудьте синхронизировать ваши изменения либо с вашим локальным сервером DynamoDB, либо с реальной службой DynamoDB, чтобы изменения заполнялись как в вашем коде, так и в системе баз данных.

Надеюсь, это поможет!Если это не решит вашу проблему, пожалуйста, не стесняйтесь комментировать, и я помогу вам в дальнейшем.

0 голосов
/ 22 сентября 2018

Я подозреваю, createdAt не является ключом диапазона вашей таблицы / индекса.Вам нужно либо сделать .filter('createdAt').ge(date), либо изменить схему таблицы / индекса.

...