dynogels icon indicating copy to clipboard operation
dynogels copied to clipboard

batch write possibilities?

Open stevenao opened this issue 7 years ago • 8 comments

batch write is supported in the sdk. is it possible to for your ORM to support it?

stevenao avatar Nov 23 '16 16:11 stevenao

+1

M1chaelTran avatar Dec 20 '16 07:12 M1chaelTran

I would be interested to see this as well. I will look into it.

jkav77 avatar Nov 26 '17 07:11 jkav77

You can pass an array to the dynogels create function.

Here's our usage (with https://github.com/andrewoh531/dynogels-promisified and https://github.com/lodash/lodash/wiki/FP-Guide):

function bulkCreate(orders) {
  return orderTable
    .createAsync(orders)
    .then(map('attrs'));
}

function create(order) {
  return orderTable
    .createAsync(order)
    .then(get('attrs'));
}

I'm assuming you want to do the bulk multi type write? E.g. some deletes, some edits and some creates all in one request?

clarkie avatar Nov 27 '17 08:11 clarkie

The way I read this is that if you supply an array to create() then dynogels will send one query for every item in the array. A batch create would send only a single query to dynamodb with an array of items. Can you clarify this one @stevenao or @M1chaelTran?

jkav77 avatar Nov 30 '17 06:11 jkav77

As per #123, the API call being discussed allows putting multiple items in a single API call. I believe we can simply reimplement the array case of model.create() to use this API call and gain performance without losing functionality.

Note that this API call does have a limit on the amount of data that can be sent in one call (25MB) so we would need some logic to potentially split up items into multiple batches.

cdhowie avatar Dec 15 '17 17:12 cdhowie

@cdhowie you may run into nomenclature challenges then. batchWrite actually supports put AND delete.

The BatchWriteItem operation puts or deletes multiple items in one or more tables. A single call to BatchWriteItem can write up to 16 MB of data, which can comprise as many as 25 put or delete requests. Individual items to be written can be as large as 400 KB. http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchWriteItem.html

Where as dynogels model.create(), I believe, only handles creating.

I would suggest reimplementing the array case of model.create() also inside of model.destroy() but it sounds like @clarkie is right and that someone may want to do a mixed request which would feel weird making it from .create() or .destroy().

Perhaps creating a model.batchWrite as well as reimplementing array model.create() and doing the same for model.destroy?

iDVB avatar Dec 16 '17 21:12 iDVB

@iDVB I agree with your suggested structure: a batchWrite method that handles both put and delete functionality. create and destroy call batchWrite when invoked with an array.

jkav77 avatar Dec 17 '17 16:12 jkav77

@dangerginger & @cdhowie

Is there anything new on this topic, or do you know who is building it atm? 👍

sp90 avatar Jul 19 '18 11:07 sp90