AWS CloudSearch: значение [fieldname] не может быть массивом JSON или объектом


У меня возникла эта проблема с полем типа int-array. Использование aws-sdk для Node.js, я отправляю документ через домен CloudSearchDomain.метод uploadDocuments () . JSON для документа (в переменной searchContent ) создается в процессе узла, затем я использую:

var params = {
  contentType: 'application/json',
  documents: JSON.stringify([searchContent])
};
csd.uploadDocuments(params, function(err, data){
  ...(callback process)...
});

Нестроковый объект searchContent выглядит следующим образом:

{ id: 1,
  type: 'Product',
  hash_type_id: 'Product-1',
  name: 'Test product',
  description: 'A test product',
  category: [ 2 ],
  content: '<some text here>',
  state: [ 1 ],
  hash_all: '<some text>'
}

И строчится так:

[{"id":1,"type":"Product","hash_type_id":"Product-1","name":"Test product","description":"A test product","content":" <some text>","category":[2],"state":[1],"hash_all":"<some text>"}]

Ошибка, которую я получаю:

{
  "message": "{ ["The value of category cannot be a JSON array or object"] }",
  "code": "DocumentServiceException",
  "time": "2014-11-20T01:24:27.499Z",
  "statusCode": 400,
  "retryable": false
}

Как как уже упоминалось, поле category имеет тип int-array. С чего бы мне получать это сообщение?

UPDATE: я также пытался использовать типизированный массив (Int16Array) для поля category, с точно таким же результатом.

1 2

1 ответ:

Документ должен быть завернут в параметры пакетной обработки. В пакете каждый документ должен иметь следующий формат:

{
  type: "add|update|delete",
  id: "Unique ID",
  fields: Document JSON here
}

И это должно быть в массиве, даже если это всего лишь один документ. Таким образом, JSON для документа в вопросе становится:

{
  type: "add",
  id: "Product-1",
  fields: { id: 1,
    type: 'Product',
    hash_type_id: 'Product-1',
    name: 'Test product',
    description: 'A test product',
    category: [ 2 ],
    content: '<some text here>',
    state: [ 1 ],
    hash_all: '<some text>'
  }
}