Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何使用&x201C;在”;使用array-dynamodb的filteexpression中的语句_Node.js_Amazon Dynamodb_Aws Sdk - Fatal编程技术网

Node.js 如何使用&x201C;在”;使用array-dynamodb的filteexpression中的语句

Node.js 如何使用&x201C;在”;使用array-dynamodb的filteexpression中的语句,node.js,amazon-dynamodb,aws-sdk,Node.js,Amazon Dynamodb,Aws Sdk,检查了AWS文档,但未找到任何工作示例 这是我的尝试 var params = { TableName: "User", IndexName:"a-b-index", KeyConditionExpression: "Country = :country and #s = :status", FilterExpression: "Id IN (:e)", ExpressionA

检查了AWS文档,但未找到任何工作示例

这是我的尝试

var params = {
            TableName: "User",
            IndexName:"a-b-index",
            KeyConditionExpression: "Country = :country and #s = :status",
            FilterExpression: "Id IN (:e)",
            ExpressionAttributeValues: {
              ":country ": "USA",
              ":status": 1,
              ":e": "1"

            },
            ExpressionAttributeNames: {"#s": "Status"}
          };

          //get users
          dynamodb.query(params, function (err, data) {
            if (err)
              //error
            else {
              //success

            }
          });
已获取记录,但正在获取id为
1
的记录,但我希望使用如下数组

 var params = {
        TableName: "User",
        IndexName:"a-b-index",
        KeyConditionExpression: "Country = :country and #s = :status",
        FilterExpression: "Id IN (:e)",
        ExpressionAttributeValues: {
          ":country ": "USA",
          ":status": 1,
          ":e": ["1","2","3"]

        },
        ExpressionAttributeNames: {"#s": "Status"}
      };

      //get users
      dynamodb.query(params, function (err, data) {
        if (err)
          //error
        else {
          //success

        }
       });
如何使上述代码正常工作。希望获取记录。语法正确,查询运行无误,但我没有得到记录

请参考此

摘要:-

var params = {
    TableName : "Users",
    FilterExpression : "username IN (:user1, :user2)",
    ExpressionAttributeValues : {
        ":user1" : "john",
        ":user2" : "mike"
    }
};
var titleValues = ["The Big New Movie 2012", "The Big New Movie"];
var titleObject = {};
var index = 0;
titleValues.forEach(function(value) {
    index++;
    var titleKey = ":titlevalue"+index;
    titleObject[titleKey.toString()] = value;
});

var params = {
    TableName : "Movies",
    FilterExpression : "title IN ("+Object.keys(titleObject).toString()+ ")",
    ExpressionAttributeValues : titleObject
};
对于“in”子句中固定数量的值:-

var params = {
    TableName : "Users",
    FilterExpression : "username IN (:user1, :user2)",
    ExpressionAttributeValues : {
        ":user1" : "john",
        ":user2" : "mike"
    }
};
var titleValues = ["The Big New Movie 2012", "The Big New Movie"];
var titleObject = {};
var index = 0;
titleValues.forEach(function(value) {
    index++;
    var titleKey = ":titlevalue"+index;
    titleObject[titleKey.toString()] = value;
});

var params = {
    TableName : "Movies",
    FilterExpression : "title IN ("+Object.keys(titleObject).toString()+ ")",
    ExpressionAttributeValues : titleObject
};
对于数组中的更多元素并动态形成过滤器表达式:-

var params = {
    TableName : "Users",
    FilterExpression : "username IN (:user1, :user2)",
    ExpressionAttributeValues : {
        ":user1" : "john",
        ":user2" : "mike"
    }
};
var titleValues = ["The Big New Movie 2012", "The Big New Movie"];
var titleObject = {};
var index = 0;
titleValues.forEach(function(value) {
    index++;
    var titleKey = ":titlevalue"+index;
    titleObject[titleKey.toString()] = value;
});

var params = {
    TableName : "Movies",
    FilterExpression : "title IN ("+Object.keys(titleObject).toString()+ ")",
    ExpressionAttributeValues : titleObject
};
的答案是正确的,但我不能使用
表达式属性值中的其他值,如
:country
:status
,因此这里是修改后的答案,以使其按照我的要求工作

var AttributeValuesObject = {};

  AttributeValuesObject[':country '] = "USA";
  AttributeValuesObject[':status'] = 1;

  var titleValues = ["1", "2"];
  var titleObject = {}; 

  var index = 0; 

  titleValues.forEach(function(value) {
    index++;
    var titleKey = ":titleValue"+index;
    AttributeValuesObject[titleKey.toString()] = value;
    titleObject[titleKey.toString()] = value;
  });

  var params = {
    TableName: "User",
    IndexName:"a-b-index",
    KeyConditionExpression: "Country = :country and #s = :status",
    FilterExpression: "Id IN ("+Object.keys(titleObject).toString()+ ")",
    ExpressionAttributeValues: AttributeValuesObject,
    ExpressionAttributeNames: {"#s": "Status"}
  };

  //get users
  dynamodb.query(params, function (err, data) {
    if (err)
      //error
    else {
      //success

    }
   });
使用es5和map:

const参数={
TableName:“个性化设置”,
KeyConditionExpression:'accountId=:accountId',
FilterExpression:`websiteId IN(${websites.map(w=>`:${w.websiteId}').join(',')})`,
表达式属性值:{:accountId:accountId}
}
用于(网站的const网站){
params.ExpressionAttributeValues[`:${website.websiteId}`]=website.websiteId
}
const{Items:personalizations}=wait docClient.query(params.promise())

您也可以使用ConceptQuest的方法,只需在
标题对象{}
中插入其他属性值即可。 e、 g

注意:如果不使用,可能需要添加类似“S”的模式 文档客户端


我已经这样做了,解析了一次参数列表

constusers=[{userId:1,name:'joe'},{userId:2,name:'mike'}]
const expressionAttributeValues={};
const userIdParams=users.map((u,i)=>{
const userParam=`:user${i}`;
expressionAttributeValues[userParam]=u.userId;
返回userParam;
}).join(“,”)
变量参数={
TableName:'用户',
FilterExpression:`username IN(${userIdParams})`,
ExpressionAttribute值:ExpressionAttribute值
};Python3版本:

def get_filter_for_in_子句(列名称、列值、列类型=“S”):
表达式=[]
对于范围内的i(len(in_值)):
expressions.append(f':temp{i}')
filter_expression=f'{column_name}IN({“,”.join(expressions)}
表达式\属性\值={}
对于索引,枚举中的表达式(表达式):
表达式\属性\值[表达式]={column\类型:in\值[索引]}
返回筛选器\表达式、表达式\属性\值
用法:

column='testcolumn'
输入=['testvalue1','testvalue2','testvalue3']
filter\u表达式,expression\u attribute\u values=get\u filter\u for\u in_子句(列,输入)
结果:

#filter_表达式='testcolumn IN(:temp0,:temp1,:temp2)'
#表达式_属性_值={:temp0':{'S':'testvalue1'},:temp1':{'S':'testvalue2'},:temp2':{'S':'testvalue3'}

您是如何测试它的?@NiroshanRanapathi您是什么意思?@NiroshanRanapathi我使用的是无服务器框架。正在本地检查它是否在dynamodb本地主机上工作?@NiroshanRanapathi我没有在本地主机上使用dynamodb。我使用的是live dynamodb Hanks作为答案,将尝试它,dynamodb不支持join,我想基于其他表记录获取记录,所以我想在operator中使用,因为没有任何其他选项,但您告诉我们,对于1000个用户来说,从性能方面来说,这并不是最好的方法?在这种情况下,您需要将其导出或流式传输到EMR或其他内容,并检索所需的信息。大多数NOSQL数据库不支持join。另一种选择是检查数据模型,如果大小小于4KB,则将所有必需的数据存储在一个表中。请注意,SO中的大多数答案并不是专门针对要求编写的。有时它们只是解决问题的指针。这是不正确的:“KeyConditions”或“KeyConditionExpression”是必需的字段谢谢你的工作。仅缺少->titleObject[titleKey.toString()]={S:value}无需保留索引变量,forEach回调中的第二个参数是当前值的索引:
titleValue.forEach(函数(值,索引){…
如果这个概念有帮助,尽管它不是专门为您的用例编写的,您能接受这个答案吗?如果您有重复的网站ID,这里可能会出现问题(会导致重复键)。@kords answer使用.map index作为键名来避免这个问题。