El término NoSQL abarca una cantidad de tecnologías de base de datos que nacieron de la necesidad de la industria del software, de trabajar con grandes volúmenes de datos, con un alto nivel de concurrencia y necesidades altas de procesamiento y desempeño bajo estas premisas.
Las bases de datos NoSQL se han clasificado mayormente por la forma como se almacenan o se acceden los datos(Modelo de datos). Las más comunes son:

// IOS:
CBLManager *manager = [CBLManager sharedInstance];
NSError *error;
self.database = [manager databaseNamed: @"my-database" error: &error];
if (!self.database) {
[self handleError: error];
}
//Android
try {
Manager manager = new Manager(new AndroidContext(mContext), Manager.DEFAULT_OPTIONS);
Database db = manager.getExistingDatabase("my-database");
if(db != null) {
}
} catch (IOException e) {
Log.e(TAG, "Cannot delete database", e);
return;
}
{
"address": "Cra 12 N 12 - 24",
"city": "Medellín",
"code": "123123",
"conctact": "Daniel Mejía",
"country": "Colombia",
"discount": "0.3",
"email": "exito@exito.com",
"identifier": "911212333",
"lastUpdate": "2014-12-15 00:00:00",
"name": "Exito",
"phone": "345 23 12",
"sellerCode": "33331"
}
{
"id": "MDEyNzI4TQ==",
"rev": "2-000003c2fc708d000000000000000000",
"expiration": 0,
"flags": 0
}
//Android
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("type", "list");
properties.put("title", title);
properties.put("created_at", currentTimeString);
properties.put("owner", "profile:" + userId);
properties.put("members", new
ArrayList<String>());
Document document = database.createDocument();
document.putProperties(properties);
//IOS
NSString* owner = [@"profile:" stringByAppendingString: userId];
NSDictionary* properties = @{@"type": @"list",
@"title": title,
@"created_at": currentTimeString,
@"owner": owner,
@"members": @[]};
CBLDocument* document = [database createDocument];
NSError* error;
if (![document putProperties: properties error: &error]) {
[self handleError: error];
}
//Android
Document doc = database.getDocument(myDocId);
// We can directly access properties from the document object:
doc.getProperty("title");
// Or go through its properties dictionary:
Map<String, Object> properties = doc.getProperties();
String owner = (String) properties.get("owner");
//IOS
CBLDocument* doc = [database documentWithID: _myDocID];
// We can directly access properties from the document object:
NSString* title = doc[@"title"];
// Or go through its properties dictionary:
NSDictionary* properties = doc.properties;
NSString* owner = properties[@"owner"];
//Android
Document doc = database.getDocument(myDocId);
doc.update(new Document.DocumentUpdater() {
@Override
public boolean update(UnsavedRevision newRevision) {
Map<String, Object> properties = newRevision.getUserProperties();
properties.put("title", title);
properties.put("notes", notes);
newRevision.setUserProperties(properties);
return true;
}
});
//IOS
CBLDocument* doc = [database documentWithID: _myDocID];
NSMutableDictionary* p = [doc.properties mutableCopy];
p[@"title"] = title;
p[@"notes"] = notes;
NSError* error;
if (![doc putProperties: p error: &error]) {
[self handleError: error];
}
//Android
Document doc = database.getDocument(myDocId);
doc.update(new Document.DocumentUpdater() {
@Override
public boolean update(UnsavedRevision newRevision) {
newRevision.setIsDeletion(true);
Map<String, Object> properties = newRevision.getUserProperties();
properties.put("deleted_at", currentTimeString);
newRevision.setUserProperties(properties);
return true;
}
})
//IOS
CBLDocument* doc = [database documentWithID: _myDocID];
NSError* error;
if (![doc deleteDocument: &error]) {
[self handleError: error];
}
Son índices de los documentos que se encuentran en la base de datos
Couchbase no tiene un lenguaje como SQL para los querys, se basa en una técnica llamada map/reduce inspirado en las funciones map and reduce usadas en la programación funcional.
El principal componente de una vista es su función map
Una vista tambien puede contener una función reduce:
Si está presente, se usa durante los querys para combinar multiples filas en una(Ej. Count, average, group)
//IOS
CBLView* phoneView = [db viewNamed: @"phones"];
[view setMapBlock: MAPBLOCK({
for (NSString* phone in doc[@"phones"]) {
emit(phone, doc[@"name"]);
}
}) version: @"2"];
//Android
View phoneView = database.getView("phones");
phoneView.setMap(new Mapper() {
@Override
public void map(Map<String, Object> document, Emitter emitter) {
List<String> phones = (List) document.get("phones");
for (String phone : phones) {
emitter.emit(phone, document.get("name"));
}
}
}, "2");
Map
//IOS
CBLView* phoneView = [db viewNamCBLView* phoneView = [db viewNamed: @"phones"];
[view setMapBlock: MAPBLOCK({
for (NSString* phone in doc[@"phones"]) {
emit(phone, doc[@"name"]);
}
}) reduceBlock:^id(NSArray *keys, NSArray *values, BOOL rereduce) {
return @(values.count);
}) version: @"2"];
ed: @"phones"];
[view setMapBlock: MAPBLOCK({
for (NSString* phone in doc[@"phones"]) {
emit(phone, doc[@"name"]);
}
}) version: @"2"];
Map/Reduce
CBLQuery* query = [[[IGDBManager sharedInstance] allClients] createQuery];
NSMutableArray* clients = [NSMutableArray new];
[query runAsync:^(CBLQueryEnumerator *result, NSError *error) {
if (result && !error){
for(CBLQueryRow *row in result){
IGClient * client = [[IGClient alloc] init];
[client updateWithDictionary:row.document.properties];
[clients addObject:client];
}
block([NSArray arrayWithArray:clients], nil);
}else {
block(nil, [IGError defaultCouchBaseError]);
}
}];
CBLView * view = [self.database viewNamed: @"allClients"];
[view setMapBlock: MAPBLOCK({
if ([doc[@"type"] isEqualToString:@"client"]) {
if (doc[@"code"])
emit(doc[@"code"], nil);
}
}) version: @"1"];
return view;Principalmente depende del escenario al que nos enfrentemos:
http://nosql-database.org/