2014-11-04 2 views
2

Я пытаюсь использовать пользовательские типы в Cassandra с nodejs. Следуя документации, я успешно справляюсь с этим в cqlsh (https://www.datastax.com/documentation/cql/3.1/cql/cql_using/cqlUseUDT.html). Мне удается вставлять элементы в cqlsh, но не использовать модуль cassandra-driver.Использование пользовательских типов в Cassandra с nodejs

Я понимаю, что они некоторые тонкости делают с использованием javascript (http://www.datastax.com/documentation/developer/nodejs-driver/1.0/nodejs-driver/reference/nodejs2Cql3Datatypes.html), и я попробовал различные варианты, но я не мог заставить его работать.

Вот мои испытания и их результате сообщение об ошибке:

var insertQuery = 'INSERT INTO mykeyspace.users (id, name) VALUES (?, ?)' 

client.execute(insertQuery, ['62c36092-82a1-3a00-93r1-46196ee77204', { firstname: 'paul', lastname: 'jacques'}], {hints: ['uuid', 'map<text, text>']}, function(err) { console.log(err);}) 

{ name: 'ResponseError', message: 'Not enough bytes to read 0th field java.nio.HeapByteBuffer[pos=0 lim=9 cap=9]', info: 'Represents an error message from the server', code: 8704, query: 'INSERT INTO mykeyspace.users (id, name) VALUES (?, ?)' }

client.execute(insertQuery, ['62c36092-82a1-3a00-93r1-46196ee77204', { firstname: 'paul', lastname: 'jacques'}], { prepare: true }, function(err) { console.log(err);}) 

    { [TypeError: Not a valid blob, expected Buffer obtained { firstname: 'paul', lastname: 'jacques' }] 
    query: 'INSERT INTO mykeyspace.users (id, name) VALUES (?, ?)' } 

Тогда что такое правильный синтаксис, чтобы заставить его работать?

NB. Я использую cassandra 2.1.1

ответ

2

Драйвер DataStax Node.js еще не поддерживает определенные пользователем типы, поэтому драйвер не сможет сериализовать данные соответствующим образом.

Вы можете использовать json-нотацию в CQL для доступа к отдельным полям. Например, запросы, подобные следующему будут работать:

SELECT addr.street, addr.city FROM location WHERE id=?; 

или

UPDATE SET addr['street'] = ?, addr['city'] = ? WHERE id = ? 
+0

Спасибо, что является предпочтительным способом для хранения вложенных объектов JSON тогда? В настоящее время я использую blobs, но это делает запрос по буферному столбцу невозможным и обновляет более дорогие ... – Spearfisher

+0

Замороженные UDT-файлы предназначены для небольших объектов, если вы можете заставить его работать с обозначением json, включенным в мой ответ, вы должны его использовать (позже вы можете использовать уровень драйвера udt). Если вам нужны большие объекты, вы можете использовать несколько столбцов или использовать для этого другое семейство столбцов. – jorgebg