node-cassandra

An ORM for Cassandra
- Provides support for current Cassandra 3.x builds.
- Tested at scale with distribution in real production environments.
- Mostly feature-complete, active development is underway to add remaining features.
- Open to suggestions! Just create an issue and tag it.
Read the full API Documentation.
Examples:
Cassandra Known Versions Supported:
Known Supported NodeJS Versions:
Getting Started
Connecting to the database
var Cassandra = require('node-cassandra');
var config = {
contactPoints: ['127.0.0.1:9042'],
protocolOptions: {port: 9042},
keyspace: {
testkeyspace: {
durableWrites: true,
withReplication: {
class: 'SimpleStrategy',
replication_factor: 1
}
}
}
};
var cassandra = Cassandra.connect(config);
cassandra.on('error', (err) => console.log(err));
cassandra.on('connect', (err) => console.log('connected'));
Creating your first Schema, Model and Materialized View
var schema = new Cassandra.Schema({
id: {
type: 'uuid',
default: Cassandra.uuid
},
username: {
type: 'text',
required: true
},
ageName: {
type: 'text',
default: (instance) => {
return instance.age + instance.name;
}
},
name: 'text',
age: 'int'
}, {
primaryKeys: ['username'],
views: {
byName: {
primaryKeys: ['name'],
orderBy: {
name: 'asc'
}
},
}
});
var TestModel = cassandra.model('testModel', schema, (err) => {
test.save((err) => {
if (err) {
throw err;
}
console.log('test saved!');
test.age = 29;
test.save((err) => {...});
});
});
var test = new TestModel({
name: 'bar',
username: 'foo',
age: 30
});
Working with Collections and Indexes
List Types
var schema = new Cassandra.Schema({
name: 'text',
usernames: {
type: {
list: 'text'
}
}
}, {
indexes: ['usernames'],
primaryKeys: ['name']
});
Inserting lists
var TestModel = cassandra.model('testModel', schema, (err) => {
var test = new TestModel({
name: 'bar',
usernames: ['foo', 'bar']
});
test.save(() => {
TestModel.findOne({
usernames: {
$contains: 'foo'
}
}, (err, row) => {
console.log(row.usernames);
});
});
});
Updating lists
var query = {
name: 'bar',
usernames: {
$contains: 'foo'
}
};
var updateObject = {
usernames: {
$filter: ['foo'],
$append: ['baz'],
$prepend: ['fii']
}
};
TestModel.update(query, updateObject, (err) => {
if (err) {
return console.log(err):
}
TestModel.findOne({usernames: {$contains: 'baz'}}, (err, row) => {
console.log(row.usernames);
});
});
Updating lists by index
var query = {
name: 'bar',
usernames: {
$contains: 'bar'
}
};
var updateObject = {
usernames: {
$set: {
0: 'foo'
}
}
};
TestModel.update(query, updateObject, (err) => {
if (err) {
return console.log(err):
}
TestModel.findOne(query, (err, row) => {
console.log(row.usernames);
});
});
Deleting lists by column or index
var query = {
name: 'bar',
usernames: {
$contains: 'fii'
}
};
var deleteObject = {
usernames: [0,2]
};
TestModel.delete(query, deleteObject, (err) => {
if (err) {
return console.log(err):
}
TestModel.findOne({usernames: {$contains: 'bar'}}, (err, row) => {
console.log(row.usernames);
TestModel.delete({
usernames: {
$contains: 'bar'
}
}, {
usernames: 1
}, (err) => {...});
});
});
Set Types
var schema = new Cassandra.Schema({
name: 'text',
usernames: {
type: {
set: 'text'
}
}
}, {
indexes: ['usernames'],
primaryKeys: ['name']
});
Inserting sets
var TestModel = cassandra.model('testModel', schema, (err) => {
var test = new TestModel({
name: 'bar',
usernames: ['foo', 'bar']
});
test.save(() => {
TestModel.findOne({
usernames: {
$contains: 'foo'
}
}, (err, row) => {
console.log(row.usernames);
});
});
});
Updating sets
var query = {
name: 'bar',
usernames: {
$contains: 'bar'
}
};
var updateObject = {
usernames: {
$add: ['aba', 'boa'],
$filter: ['foo']
}
};
TestModel.update(query, updateObject, (err) => {
if (err) {
return console.log(err):
}
TestModel.findOne(query, (err, row) => {
console.log(row.usernames);
});
});
Update sets to null
var query = {
name: 'bar',
usernames: {
$contains: 'bar'
}
};
var updateObject = {
usernames: []
};
TestModel.update(query, updateObject, (err) => {
if (err) {
return console.log(err):
}
TestModel.findOne(query, (err, row) => {
console.log(row.usernames);
});
});
Deleting sets
var query = {
name: 'bar',
usernames: {
$contains: 'fii'
}
};
var deleteObject = {
usernames: 1
};
TestModel.delete(query, deleteObject, (err) => {
if (err) {
return console.log(err):
}
TestModel.findOne({name: 'bar'}, (err, row) => {
console.log(row.usernames);
});
});
Map Types
var schema = new Cassandra.Schema({
name: 'text',
usernames: {
type: {
map: ['text', 'int']
}
}
}, {
indexes: ['usernames'],
primaryKeys: ['name']
});
Inserting maps
var TestModel = cassandra.model('testModel', schema, (err) => {
var test = new TestModel({
name: 'bar',
usernames: {
$set: {
foo: 2,
bar: 4
}
}
});
test.save(() => {
TestModel.findOne({
usernames: {
$containsKey: 'foo'
}
}, (err, row) => {
console.log(row.usernames.foo);
});
});
});
Updating maps
var query = {
name: 'bar',
usernames: {
$containsKey: 'bar'
}
};
var updateObject = {
usernames: {
foo: 5,
fii: 7 /set "fii" to 7
}
};
TestModel.update(query, updateObject, (err) => {
if (err) {
return console.log(err):
}
TestModel.findOne(query, (err, row) => {
console.log(row.usernames.foo);
});
});
Deleting maps by Keys
var query = {
name: 'bar',
usernames: {
$containsKey: 'bar'
}
};
var deleteObject = {
usernames: ['foo']
};
TestModel.delete(query, deleteObject, (err) => {
if (err) {
return console.log(err):
}
TestModel.findOne(query, (err, row) => {
console.log(row.usernames.foo);
});
});
Deleting maps
var query = {
name: 'bar',
usernames: {
$containsKey: 'bar'
}
};
var deleteObject = {
usernames: 1
};
TestModel.delete(query, deleteObject, (err) => {
if (err) {
return console.log(err):
}
TestModel.findOne(query, (err, row) => {
console.log(row.usernames);
});
});
Table Compaction
var schema = new Cassandra.Schema({
id: 'uuid',
name: 'text'
}, {
primaryKeys: ['username'],
compaction: {
class: 'DateTieredCompactionStrategy',
timestamp_resolution: 'MICROSECONDS',
base_time_seconds: 3600,
max_sstable_age_days: 365
}
});
Static Methods
var schema = new Cassandra.Schema({
id: {
type: 'uuid',
default: Cassandra.uuid
},
username: {
type: 'text',
required: true
},
name: 'text'
}, {
primaryKeys: ['username'],
views: {
byName: {
primaryKeys: ['name']
},
}
});
schema.statics.findByName = function (name, callback) {
this.views.byName.findOne({name: name}, callback);
};
var TestModel = cassandra.model('testModel', schema, (err) => {
TestModel.findByName('foo', (err, row) => {
console.log(row.name);
});
});