我正在使用 AWS DynamoDB 来存储用户。
考虑以下代码:
let params = {
RequestItems: {
'users': {
Keys: [
{id: '1111'},
{id: '2222'},
{id: '3333'},
{id: '4444'},
]
}
}
};
Run Code Online (Sandbox Code Playgroud)
在 BatchGet 中使用上述参数将返回被请求的用户,但顺序是随机的!
问题:是否可以在不丢失 Keys 中定义的顺序的情况下 BatchGet 用户?
我的表结构如下,其中time唯一键是唯一键,“01”是计数的 id,一个月的项目将在任何 id 获得该月的计数结果后立即创建。
{
"details": {
"01": {
"a": {
"count": [10, 5]
},
"b": {
"count": [10, 5]
}
}
},
"time": "2020_06"
}
Run Code Online (Sandbox Code Playgroud)
我使用更新函数来保存计数结果:
var params = {
TableName: tableName,
Key: { time },
UpdateExpression: `ADD details.#id.#type.count[0] :count0, details.#id.#type.count[1] :count1`,
ExpressionAttributeNames: {
'#id': id,
'#type': type
},
ExpressionAttributeValues: {
':count0': count[0],
':count1': count[1]
},
ReturnValues: 'ALL_NEW'
}
Run Code Online (Sandbox Code Playgroud)
如果 id 的结果已经存在那就没问题了。但如果没有,我会收到一个错误消息
ValidationException: The document path provided in the update expression is invalid for update
Run Code Online (Sandbox Code Playgroud)
如何让地图先构建好再更新数据?我曾尝试使用SET …
DynamoDB.DocumentClientJavaScript 类型之间的自动编组和解组值是 DynamoDB 更具描述性的AttributeMap类型。但是,在处理具有StringSet属性的 Item 时,它似乎不会自动进行转换。
使用 向StringSet表添加属性时DocumentClient,我使用该createSet(...)方法将数组转换为集合。取回值时, 的倒数是createSet(...)什么?.values直接访问 Set 的最佳做法是什么?如果是这样,是否记录在某处?
这是添加具有StringSet属性的 Item 的示例代码,然后检索该项目:
const docClient = new DocumentClient();
const TableName = "StringSets-Example";
const PK = "Names";
const Values = ["Peter", "Paul", "Mary"];
const putParams = {
TableName,
Item: {
PK,
names: docClient.createSet(Values)
}
}
await docClient.put(putParams).promise();
// ... some time later, I can retrieve the value with ...
const getParams = { …Run Code Online (Sandbox Code Playgroud) 我正在为下面的代码编写单元测试,这些代码使用带有where(filter)条件的Document客户端CreateDocumentQuery方法。
var documentQuery = ReadOnlyDocumentClient.CreateDocumentQuery<MyView>(UriFactory.CreateDocumentCollectionUri(Constants.COSMOS_DB_NAME, Constants.MY_VIEW_COL_NAME))
.Where(w => w.Name== query.Name)
.Where(w => w.DOB> query.StartDate && w.DOB < query.EndDate)
.AsDocumentQuery();
Run Code Online (Sandbox Code Playgroud)
查询是一个命令参数,它是一个输入。
我正在使用最小起订量进行模拟,并且正在使用以下代码行进行模拟
mockDocumentClient.Setup(s => s.CreateDocumentQuery<MyView>(It.IsAny<Uri>(), It.IsAny<FeedOptions>())).Returns(mockDocumentQuery.Object);
Run Code Online (Sandbox Code Playgroud)
现在,上面的代码仅模拟CreateDocumentQuery,执行条件时,我没有得到模拟支持。
请提出如何在哪里条件下模拟CreateDocumentQuery?
提前致谢。
我有一个简单的逻辑,我想INSERT使用 记录在表中AWS.DynamoDB.DocumentClient。下面是我正在使用的代码。在这里,我注意到.put正在更新记录,但不知道为什么。
在检查 CW 中的日志时,我没有看到任何错误,所以不确定我在这里错过了什么。
代码:
async addEvent(incomingModel: MyModel): Promise <MyModel> {
const dynamoModel: MyModel = {
fieldOne: incomingModel.fieldOne,
fieldTwo: incomingModel.fieldTwo,
"One#two#three": `${incomingModel.one}#${incomingModel.two}#${incomingModel.three}`,
fieldThree: incomingModel.fieldThree,
fieldFour: incomingModel.fieldFour,
};
var params = {
TableName: 'Table',
Item: dynamoModel,
};
return this.documentClient
.put(params)
.then((data) => {
this.logger.debug(
"Response received from Dynamo after adding an incomingModel",
data,
this.constructor.name,
);
return data as MyModel;
})
.catch((error) => {
const errorMessage = JSON.stringify(error);
this.logger.error(
`Error creating incomingModel with body of …Run Code Online (Sandbox Code Playgroud) amazon-web-services node.js amazon-dynamodb typescript documentclient
根据文档,我应该在删除之前获取包含该项目的数据结构(如果没有错误)
我确实检查没有错误,但我得到了一个空对象data:
docClient.delete(params, (err, data) => {
if (err) {
console.error('Error tring to delete item:' + err);
callback(err, null); // error
} else if (!data.Items || data.Items.length == 0) {
console.info(JSON.stringify(data));
callback(null, null); // no items
} else {
console.info(JSON.stringify(data));
callback(null, data.Items[0].ExposeStartTimestamp);
}
});
Run Code Online (Sandbox Code Playgroud)
两者都打印空的 json: {}