目前,我正在用一个查询检查该项是否存在,然后使用put或updateItem,我想更改它并对DDB进行一次调用。我想进行一个将更新或创建项目的查询。
下面是我的项目的一个例子:
{
id: 'dsfadsf'
fa: { "apple" : { "S" : "76-100" }, "yolo" : { "S" : "0-25" }
pa: { "finish" : { "BOOL" : false }, "userKey" : { "S" : "3e299e12-9e66" } }
createdAt: 32432432423
}
项目类型:
createdAt - Number
fa - Map
pa - Map
id - String
finish - Boolean
key - String
如果项目存在,我想推送一个新项目,比如{papa:'dsfadsf'}(永远不要修改fa映射内的现有项目),并修改pa映射内的finish值
这是更新后的项目:
{
id: 'dsfadsf'
fa: { "apple" : { "S" : "76-100" }, "yolo" : { "S" : "0-25" }, "papa": { "S" : "dsfadsf"} }
pa: { "finish" : { "BOOL" : true }, "userKey" : { "S" : "3e299e12-9e66" } }
createdAt: 32432432423
}
这是我尝试的,但不起作用
{
TableName: tableName,
Key: {
id: "dsfadsf",
},
UpdateExpression: `SET #id = :id, fa.${itemName} = if_not_exists(fa.${itemName}, :text), pa.finish = if_not_exists(pa.finish, :finishval), #ca = :ca`,
ExpressionAttributeNames: {
"#id": "id",
"#ca": createdAt
},
ExpressionAttributeValues: {
":id": "7fd9a81b-7a7c-4cfb-9c84-25dc2798a8f7",
":text": itemText,
":finishval": true,
":ca": 32432432423
},
ConditionExpression: `attribute_not_exists(id)`,
};
太长,读不下去了
这是不可能与您的项目的当前结构。以下是原因-为了满足您的需求,UpdateExpression
需要采用以下形式:
if "fa" exists, add {"papa":"dsfadsf"} to it
else, create new "fa"={"papa":"dsfadsf"}
在所有DynamoDB更新表达式中,只有SET
由于以下原因,上述if-else
条件无法在带有SET的UpdateExpression
中表达:
>
设置fa。papa='dsfadsf'
将更新fa
(如果它存在),但如果它不存在,则会出现错误,更新表达式中提供的文档路径对更新无效。
SET fa={“papa”:“dsfadsf”}
将创建新的fa
,但如果它存在,将覆盖它。
如果你尝试合并,添加
现在我们只剩下ADD表达式了,但是ADD只在集合上起作用。所以如果你能负担得起把
fa
原始项目结构必须为:
{
"ca": 32432432423,
"fa": [
"apple:76-100",
"yolo:0-25"
],
"id": "dsfadsf",
"pa": [
"key:9e66"
]
}
在DynamoDB JSON中,这是:
{
"ca": {
"N": "32432432423"
},
"fa": {
"SS": [
"apple:76-100",
"yolo:0-25"
]
},
"id": {
"S": "dsfadsf"
},
"pa": {
"SS": [
"key:9e66"
]
}
}
现在,使用以下代码:
let AWS = require("aws-sdk")
let docClient = new AWS.DynamoDB.DocumentClient()
docClient.update({
TableName: "my-table",
Key: { id: "dsfadsf" },
UpdateExpression: `ADD fa :fa, pa :pa SET ca = :ca`,
ExpressionAttributeValues: {
":fa": docClient.createSet(["papa:dsfadsf"]),
":pa": docClient.createSet(["finished"]),
":ca": 32432432423
}
}
如果id为“dsfadsf”的项目已存在,则会按如下方式更新:
{
"ca": {
"N": "32432432423"
},
"fa": {
"SS": [
"apple:76-100",
"papa:dsfadsf",
"yolo:0-25"
]
},
"id": {
"S": "dsfadsf"
},
"pa": {
"SS": [
"finished",
"key:9e66"
]
}
}
如果id为“dsfadsf”的项目不存在,则会按如下方式创建:
{
"ca": {
"N": "32432432423"
},
"fa": {
"SS": [
"papa:dsfadsf"
]
},
"id": {
"S": "dsfadsf"
},
"pa": {
"SS": [
"finished"
]
}
}
在Laravel5.1中,对于MySQL insert,我希望查看记录是否已经存在,并在重复时更新,如果不存在,则创建新记录。 我已经搜索了SO,答案是旧laravel版本。在一个旧的主题中,它说去年在core中添加了一个新的方法。但是当我尝试时,我得到了错误: 这是我使用的查询: 其中,是该表中唯一的外键,我想更新记录(如果存在)或创建一个新记录。我尝试搜索5.1文档,但找不到我需要的信息。有人
问题内容: 我是Elasticsearch的新手,目前正在实现用于搜索的过滤器。到目前为止,我的索引具有以下映射(我已经删除了一些字段): geo_distance字段将在location字段上实现,示例实例如下所示: 即采用geoJSON格式。 我了解我将必须更新索引,以使location字段的类型为,如文档(mapping-geo- point )中所述。似乎我必须删除索引并创建一个新索引,但
对于一个小的新项目,我决定尝试一下JDBI(通常我使用hibernate/jpa)。 我喜欢使用@SqlUpdate/@Sql Query创建轻量级、基于注释的dao。 但是:在某些情况下,我无法确定是要创建实体还是更新现有实体。我会放置一个“选择”语句,并根据其返回值使用插入或更新语句。 问题:jdbi中的“仅接口”道是否以某种方式支持这一点?还是我必须自己编写一个“createOrUpdate
问题内容: 我想创建一个模型对象,例如Person,如果不存在person的id,否则我将获得该person对象。 创建新人员的代码如下: 但是我不知道在哪里检查并获取现有的人对象。 问题答案: Django中已经有一个,https://docs.djangoproject.com/en/dev/ref/models/querysets/#get- or-create 对你来说可能是:
插入新记录或更新(如果存在)的缩写是什么?
问题内容: 我有一个条件,即StringBuilder会不断存储与大型平面文件(100兆字节)中的模式匹配的行。但是,达到条件后,我将StringBuilder变量的内容写入文本文件。 现在我想知道是否应该通过重置对象->使用相同的变量 要么 请提出就性能和OOM问题而言您认为哪个更好。 问题答案: 我认为通话仍然很昂贵,您应该这样做: 重置它。 更新: 查看完 源代码后 ,似乎完整保留了旧缓冲区