Dynamose/DynamoDB更新将空数组保存为null

Dynamoose/DynamoDB update saving empty array as null

本文关键字:数组 保存 null DynamoDB 更新 Dynamose      更新时间:2023-09-26

我正在使用Node.js包Dynamose来处理web应用程序中的DynamoDB请求。

问题是,每当JSON对象包含空数组时,当我尝试更新该项时,Dynamose似乎将其设置为null。或者我所知道的可能是迪纳摩。

下面是我在这个表中使用的模式的一部分。

var NoteSchema = new dynamoose.Schema({
    _id: String,
    details: Array
});

在下面的代码中,变量body被设置为{details: []}。我已经通过运行console.log(body);确认了这一点。

Note.update({
    _id: searchid
}, body, function(err, note) {
    if (err) {
        console.log(err);
    } else {
        console.log(note);
    }
});

当运行console.log(note); details时,回调函数内部甚至根本没有出现问题。所以它是null或未定义的。在亚马逊网络服务中,details对于该条目来说根本不存在。

奇怪的是,当创建一个新的Note、设置details = []并保存它时,details是一个空数组,并且工作得很好。因此,在我看来,更新记录并将该属性设置为空数组似乎是一个特定的问题,因为创建记录并将其设置为空阵列非常有效。

如何更新记录并将详细信息设置为空数组?

想明白了。已将此问题提交到GitHub回购。基本上,下面的代码行(lib/Model.js关于第396行)检查该值是否为长度为0的数组。如果是这样,它将在将JSON密钥发送到AWS之前删除该密钥。

if(val === null || val === undefined || val === '' || (Array.isArray(val) && val.length === 0)) {

我使用fork提交了一个pull请求。在那个pull请求中,我进行了更改,允许将选项的可选JSON对象参数传递到更新函数中。这是更新函数的第三个参数,就在回调函数之前。如果有一个名为emptyarrayallowed的键,并且该值被设置为true,那么上面的那一行将被更改为以下内容。

if(val === null || val === undefined || val === '') {

例如,在我上面的例子中,将更新功能更改为以下功能将起作用(只要您正在使用我的fork或pull请求已获得批准)。

Note.update({_id: searchid}, body, {"emptyarrayallowed": true}, function(err, note) {
    if (err) {
        console.log(err);
    } else {
        console.log(note);
    }
});

如果您对这个解决方案有任何疑问,请告诉我。

Charlie答案的小更新。正如Charlie所提到的,功能被合并了。但是,属性名称似乎已从emptyarrayallow重命名为allowEmptyArray。