clarkie / dynogels

DynamoDB data mapper for node.js. Originally forked from https://github.com/ryanfitz/vogels
Other
490 stars 110 forks source link

batch write possibilities? #43

Open stevenao opened 7 years ago

stevenao commented 7 years ago

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

M1chaelTran commented 7 years ago

+1

jkav77 commented 6 years ago

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

clarkie commented 6 years ago

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?

jkav77 commented 6 years ago

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?

cdhowie commented 6 years ago

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.

iDVB commented 6 years ago

@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?

jkav77 commented 6 years ago

@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.

sp90 commented 6 years ago

@dangerginger & @cdhowie

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