clarkie / dynogels

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

omitNulls why? #10

Open amitava82 opened 8 years ago

amitava82 commented 8 years ago

Is there any particular reason you are removing null/empty arrays from attrs while creating? My schema has array values and I'd like to store empty arrays if none for consistency. Or return object as per schema when getting the item from db.

clarkie commented 8 years ago

Are you saying that if you have a schema like this and create an item without any children then the children property doesn't exist? This is in line with the way the underlying db behaves.

const schema = {
  id: joi.number().integer(),
  children: vogels.types.stringSet()
}

const example = vogels.define('example', {
  hashKey: 'id',
  schema: schema,
});

example.create({id: 1},(err, volume) => {}

The same would be the case if you remove all items from a stringSet. The property will be removed completely.

example.update(1, {
  children: {
    $add: 'a',
  },
}, () => {});

example.update(1, {
  children: {
    $del: 'a',
  },
}, () => {});

If I've misunderstood the question then please let me know.

amitava82 commented 8 years ago

Ah I see. I found that empty string is not saved in dynamo(!). Does that also mean it drops empty array?

In that case, is there any way to return object as per Schema definition (add missing properties even if missing from db response) for model consistency.

clarkie commented 8 years ago

At the minute dynogels replicates the behaviours of dynamoDB. The underlying database doesn't allow empty strings (http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html) so I'm not sure it'd be a good idea to support that here.

interisti commented 7 years ago

@clarkie Hi, thanks for awesome works.

I have the same case, but in my case i'm explicitly set default([]) in Joi schema for array field. Also from http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html

An attribute value cannot be an empty String or empty Set (String Set, Number Set, or Binary Set). However, empty Lists and Maps are allowed.

Are there any reasons why empty arrays are not allowed?

madve2 commented 5 years ago

The weird thing is that it Dynogels does support empty arrays – on updates. It just omits them on inserts.

So what I ended up doing is whenever I insert (edit: I mean, create) an entity, I immediately update it with "itself".

Feels stupid, but my use-case needs very few inserts thankfully, so I think I'll be fine with the overhead this causes.

shihminlee commented 3 years ago

I'd like to reopen this issue if possible. Is there a reason that we omit empty arrays when you create them? There are scenarios where we actually need the array to be an empty array. Thanks.

shihminlee commented 3 years ago

So with this change you would be able to create documents with empty arrays. Also you can create documents with default empty array if you specify it in your schema. What do you guys think? #194