Download - Seminario mongo db springdata 10-11-2011
![Page 1: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/1.jpg)
Miguel Olivares y Leonardo Menezes
Introducción a
y Spring Data
(@moliware) (@leonardomenezes)
![Page 2: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/2.jpg)
¿Qué es MongoDB?
• Base de datos orientada a documentos
• Sin esquema
• Escalable
• DB => Colección => Documento
![Page 3: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/3.jpg)
¿Qué es una colección?
• Es un grupo de documentos.
• Se identifica con un nombre
• Es el “equivalente” a una tabla en un modelo relacional
![Page 4: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/4.jpg)
¿Qué es un documento?
• Un conjunto de pares clave-valor
• Coloquialmente un “hash”, “map” o “dictionary”
• Formato BSON
![Page 5: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/5.jpg)
Arquitectura
![Page 6: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/6.jpg)
Consola
• Consola javascript completa
• Cliente MongoDB
![Page 7: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/7.jpg)
¿Por qué MongoDB?
• Fácil escalabilidad
• Flexibilidad
• Alto rendimiento
• Consultas potentes
• MapReduce
![Page 8: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/8.jpg)
Benchmark
(45 M de documentos)
Tiempo medio de inserción
Tamaño en disco
SolR 0.603(ms) 49 GB
CouchDB 0.297(ms) 43 GB
Cassandra 0.516(ms) 50 GB
MongoDB 0.040(ms) 43 GB
![Page 9: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/9.jpg)
Introducción a Spring Data
![Page 10: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/10.jpg)
¿Por que Spring Data?
• Mapeo/Conversión entre POJOs y docs MongoDB
• MongoTemplate
• Implementación automática de Repository(DAO)
• DSL basado en Java para Query, Criteria y Update
• Soporte a persistencia mixta(Cross-store persistance)
• Integración con GeoSpatial de Mongo
• Integración con Map Reduce de Mongo
• Administración y monitorización por JMX
![Page 11: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/11.jpg)
Diseño de una aplicación
• Diseño de documentos
• Consultas de la aplicación
• Optimización de las consultas
![Page 12: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/12.jpg)
Diseño de documentos
• Identificar tipos de documentos
• Separar cada tipo de documento en distintas colecciones
• Referenciar vs Duplicar
![Page 13: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/13.jpg)
Diseño de documentos
• Identificar tipos de documentos
• Separar cada tipo de documento en distintas colecciones
• Referenciar vs Duplicar• Consistencia
• Consultas extras
• Inconsistencia
• Documento autodescriptivo
![Page 14: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/14.jpg)
Documentos
_id
name
following
_id
text
date
user
geo
Usuario Tweet
![Page 15: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/15.jpg)
Usuarios
• name : Nombre de usuario
• following: Array de referencias a usuarios
![Page 16: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/16.jpg)
Tweets
• text : texto
• date : objeto Date de javascript.
• user: referencia al usuario
• geo: coordenadas
![Page 17: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/17.jpg)
Modelo MongoDB
![Page 18: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/18.jpg)
Modelo Relacional
![Page 19: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/19.jpg)
Inserción de usuarios
var miguel = {"name" : "miguel", "following" : []}
db.user.save(miguel)
var leonardomenezes = {"name" : "leonardomenezes", "following" : [new DBRef("user", miguel._id)]}
db.user.save(leonardomenezes)
![Page 20: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/20.jpg)
Inserción de Tweets
var tweet = {"text" : "Tweet ejemplo", "date" : new Date(),
"user" : new DBRef("user", leonardomenezes._id),
"geo" : { "x" : 1, "y" : 1 } }
db.tweet.save(tweet)
![Page 21: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/21.jpg)
Actualización de documentos
• Update tipo SQL
• Posibilidad de upsert, es decir, si no existe lo crea
• Existen muchos “update modifiers” : $inc, $set, $unset, $push, $pushAll, $addToSet, $pop, $pull, $pullAll, $rename, $bit
![Page 22: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/22.jpg)
Actualización de documentos
El usuario miguel ahora sigue a leonardomenezes:
var ref_leo = new DBRef("user", leonardomenezes._id)db.user.update({"name" : "miguel"}, {$push: {"following" : ref_leo}})
![Page 23: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/23.jpg)
MongoDB Java Driver
public void ejemplo1() throws UnknownHostException, MongoException { Mongo mongo = new Mongo("localhost"); DB db = mongo.getDB("database"); db.dropDatabase(); DBCollection users = db.getCollection("users");
BasicDBObject usuario = new BasicDBObject(); usuario.put("nombre", "Marco Martinez"); users.insert(usuario);
BasicDBObject usuario2 = new BasicDBObject(); usuario2.put("nombre", "Leonardo Menezes"); usuario2.put("following", new DBRef(db, "users", usuario)); users.insert(usuario2); }
![Page 24: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/24.jpg)
MongoTemplate
Mapeo/Conversión de POJO´s
![Page 25: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/25.jpg)
Mapeo de los Documentos
@Document(collection = "tweets")public class Tweet {
private ObjectId id;
private String text;
private Date date;
@DBRef private User user;
private double[] coordinate;
... getters y constructor ...
@Document(collection = "users")public class User {
private ObjectId id; private String name;
@DBRef private Set<User> following;
... getters y constructor ...
![Page 26: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/26.jpg)
Configuración de MongoTemplate
@Configurationpublic class AppConfig {
@Bean public Mongo mongo() throws UnknownHostException, MongoException {
return new Mongo("localhost"); }
@Bean public MongoTemplate mongoTemplate() throws UnknownHostException, MongoException { return new MongoTemplate(mongo(), "database"); }
}
![Page 27: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/27.jpg)
Inserción con MongoTemplate
/** * Ejemplo sencillo de inserción */ private void ejemplo1() { User user = new User("Marco Martinez"); User user2 = new User("Alejandro Marqués"); User user3 = new User("Javier Alba"); mongoTemplate.save(user); logger.info("Users " + user + " saved"); mongoTemplate.save(user2); logger.info("Users " + user2 + " saved"); mongoTemplate.save(user3); logger.info("Users " + user3 + " saved");
user.follow(user2); mongoTemplate.save(user); logger.info("Users " + user + " updated");
}
INFO - Users User [id=4eb846971a8868b98ed3d7c3, name=Marco Martinez, following=0] savedINFO - Users User [id=4eb846971a8868b98ed3d7c4, name=Alejandro Marqués, following=0] savedINFO - Users User [id=4eb846971a8868b98ed3d7c5, name=Javier Alba, following=0] savedINFO - Users User [id=4eb846971a8868b98ed3d7c3, name=Marco Martinez, following=1] updated
![Page 28: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/28.jpg)
Update Modifiers con Spring Data
/** * Ejemplo de acutalización */ public void ejemplo2() {
mongoTemplate.updateFirst(new Query(new Criteria("name").is("Marc Martinez")), new Update().set("name", "Marco Martinez"), User.class);
User user = mongoTemplate.findOne(new Query(new Criteria("name").is("Marco Martinez")), User.class); User user3 = mongoTemplate.findOne(new Query(new Criteria("name").is("Javier Alba")), User.class);
mongoTemplate.updateFirst(new Query(new Criteria("name").is("Marco Martinez")), new Update().addToSet("following", user3), User.class);
user = mongoTemplate.findOne(new Query(new Criteria("name").is("Marco Martinez")), User.class); logger.info("User found: " + user); }
INFO - User found: User [id=4eb84a0e1a885514a5745b2d, name=Marco Martinez, following=2]
![Page 29: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/29.jpg)
Diseño de una aplicación
• Diseño de documentos
• Consultas de la aplicación
• Optimización de las consultas
![Page 30: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/30.jpg)
Consultas en MongoDB
SELECT a,b FROM users db.users.find({}, {a:1,b:1})
SELECT * FROM users WHERE age=33 db.users.find({age:33})
SELECT * FROM users WHERE age=33 ORDER BY name db.users.find({age:33}).sort({name:1})
SELECT * FROM users WHERE age=33 ORDER BY nameLIMIT=10 OFFSET=0
db.users.find({age:33}).sort({name:1}).limit(10).skip(0)
![Page 31: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/31.jpg)
Perfil de usuario
• Seguidores
• Mis tweets
![Page 32: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/32.jpg)
Consultas - Seguidores
SELECT user_following.following_id FROM user, user_following
WHERE user.name = “leonardomenezes” AND
user.id = user_following.user_id
db.user.findOne({"name" : "leonardomenezes"}, {“following” : 1});
![Page 33: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/33.jpg)
Consultas - Mis Tweets
select * from tweet where tweet.user_id=X order by date DESC
db.tweet.find({"user.$id" : X}).sort({'date' : -1})
![Page 34: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/34.jpg)
Más consultas MongoDB
SELECT * FROM users WHERE age>33 db.users.find({age:{$gt:33}})
SELECT * FROM users WHERE name LIKE "Joe%" db.users.find({name:/^Joe/})
SELECT * FROM users WHERE a=1 or b=2 db.users.find({$or:[{a:1} ,{b:2}]})
SELECT COUNT(*) FROM users db.users.count()
![Page 35: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/35.jpg)
Más operadores
• $where + código javascript
• $gt, $lt, $gte, $lte
• $all, $exists, $mod, $ne, $in, $nin, $nor, $or, $and, $size, $type .....
![Page 36: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/36.jpg)
Timeline
SELECT * FROM tweet WHERE user_id = X OR user_id = ...... ORDER BY date
db.tweet.find({"user.$id" : {$in : ids}}).sort({'date' : -1})
![Page 37: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/37.jpg)
MongoRepository(DAO)
• CRUD(CrudRepository)
• count, delete, deleteAll, exists, findOne, save...
• Paginación/Ordenación(PagingAndSortingRepository)
• Métodos de búsqueda dinámicos
![Page 38: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/38.jpg)
Repositorios
count() Returns the number of entities available.
delete(ID id) Deletes the entity with the given id.
delete(Iterable<? extends T> entities) Deletes the given entities.
delete(T entity) Deletes a given entity.
deleteAll() Deletes all entities managed by the repository.
exists(ID id) Returns whether an entity with the given id exists.
findAll() Returns all instances of the type.
findOne(ID id) Retrives an entity by its primary key.
save(Iterable<? extends T> entities) Saves all given entities.
save(T entity) Saves a given entity.
findAll(Pageable pageable) Returns a Page of entities meeting the paging restriction provided in the Pageable object.
findAll(Sort sort) Returns all entities sorted by the given options.
![Page 39: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/39.jpg)
UserRepository y TweetRepository
@Repositorypublic interface UserRepository extends MongoRepository<User, ObjectId> {
public User findByName(String name);
}
@Repositorypublic interface TweetRepository extends MongoRepository<Tweet, ObjectId> {
public List<Tweet> findByTextLike(String text);
public List<Tweet> findByDateLessThan(Date date);
@Query("{ 'user': {'$ref': 'users', '$id': { '$oid': ?0 } } }") public List<Tweet> findByUserId(String id);
}
![Page 40: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/40.jpg)
Configuración de los Repositorios
<context:annotation-config />
<context:component-scan base-package="com.paradigmatecnologico" />
<mongo:repositories base-package="com.paradigmatecnologico" />
![Page 41: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/41.jpg)
Inserción y Consulta con Repositorios
/** * Ejemplo de consultas con Repositorios */ public void ejemplo3() { User user = userRepository.findByName("Alejandro Marqués"); logger.info("User found:" + user);
tweetRepository.save(new Tweet("Hola mundo", new Date(), user, new double[] { 1.0, 0.1 }));
List<Tweet> tweets = tweetRepository.findByUserId(user.getId().toStringMongod()); logger.info("Found " + tweets.size() + " tweets");
List<Tweet> tweetsHola = tweetRepository.findByTextLike("Hola"); logger.info("Found " + tweetsHola.size() + " tweets");
}
INFO - User found:User [id=4eb84a0e1a885514a5745b2e, name=Alejandro Marqués, following=0]INFO - Found 1 tweetsINFO - Found 1 tweets
![Page 42: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/42.jpg)
Customizando Repositoriospublic interface IAdvancedTweetRepository {
public List<Tweet> timeline(List<ObjectId> ids);
}
public class AdvancedTweetRepositoryImpl implements IAdvancedTweetRepository {
@Override public List<Tweet> timeline(List<ObjectId> ids) {
return mongoTemplate.find(new Query(new Criteria("user.$id").in(ids)), Tweet.class);}}
}
public interface TweetRepository extends MongoRepository<Tweet, ObjectId>, IAdvancedTweetRepository {
}
![Page 43: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/43.jpg)
Consultando el Timeline
/** * Ejemplo de consulta timeline/repositorios customizados */ public void ejemplo4() { User user = userRepository.findByName("Marco Martinez"); List<ObjectId> following = new LinkedList<ObjectId>(); for (User currentFollowing : user.getFollowing()) { following.add(currentFollowing.getId()); } following.add(user.getId()); List<Tweet> tweets = tweetRepository.timeline(following); logger.info("Total tweets found: " + tweets.size()); }
![Page 44: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/44.jpg)
Diseño de una aplicación
• Diseño de documentos
• Consultas de la aplicación
• Optimización de las consultas
![Page 45: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/45.jpg)
Índices
• Son muy similares a los índices MySQL
• Un índice es un B-Tree
• Necesarios cuando necesitas ordenar
• Para hacer un campo único
![Page 46: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/46.jpg)
Índices
• Optimiza el uso de memoria
• Son útiles cuando las consultas devuelven parte de los documentos
![Page 47: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/47.jpg)
Índices de la aplicación
• db.tweet.ensureIndex({“user.$id” : 1 , “date” : -1})
• db.user.ensureIndex({“name” : 1}, {“unique” : true})
![Page 48: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/48.jpg)
Índices en Spring Data
/** * Creando indices */ public void ejemplo5() { IndexDefinition nameIndex = new Index().on("name", Order.ASCENDING).unique(Duplicates.DROP); mongoTemplate.ensureIndex(nameIndex, User.class);
GeospatialIndex geoIndex = new GeospatialIndex("coordinates"); mongoTemplate.ensureIndex(geoIndex, Tweet.class); }
![Page 49: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/49.jpg)
Temas Avanzados
• Geolocalización
• Trending Topics
• Retweets
![Page 50: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/50.jpg)
Geolocalización
• Requiere un índice especial
• El campo tiene que tener el formato:
• {“x” : 2, “y” : 3}
• [2, 3]
• {“latitude” : 2, “longitude” : 3}
![Page 51: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/51.jpg)
Geolocalización
• db.tweet.ensureIndex({“geo” : “2d”})
• db.tweet.find({“geo” : {“$near” : [1,0]}}).limit(10)
• db.tweet.find({“geo” : {“$within” : {“$center” : [{‘x’ : 0, ‘y’ : 0},5]}}})
![Page 52: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/52.jpg)
Geolocalización en Spring Data
/** * Busquedas Geo */ public void ejemplo6() { List<Tweet> tweets = mongoTemplate.find(new Query(new Criteria("coordinate")
.within(new Circle(3.0, 3.0, 5))), Tweet.class); logger.info("Tweets found: " + tweets.size());
tweets = mongoTemplate.find(new Query(new Criteria("coordinate").within(new Circle(3.0, 3.0, 1))), Tweet.class);
logger.info("Tweets found: " + tweets.size()); }
INFO - Tweets found: 3INFO - Tweets found: 0
![Page 53: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/53.jpg)
Trending Topics
• Repeticiones de cadenas de palabras
• Analizar los tweets de la última hora
![Page 54: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/54.jpg)
MapReduce
• “MapReduce is the Uzi of aggregation tools”
• Proceso en background
• Dos pasos: map y reduce ( y finalize)
![Page 55: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/55.jpg)
Map
• Procedimiento que se ejecuta una vez sobre cada documento.
• Cada map emite 0 o más pares clave, valor
![Page 56: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/56.jpg)
Reduce
• Procedimiento que se ejecuta una vez por cada clave
• La entrada es la clave y la lista de valores que fueron emitidas con esa clave
• La salida puede ser cualquier estructura de datos
![Page 57: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/57.jpg)
Finalize
• Se ejecuta justo antes de guardar los resultados
• Útil para construir un resultado final, borrar elementos redundantes, etc
![Page 58: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/58.jpg)
Resultado
• El resultado final se almacena en una colección
• Documentos con el formato:
{ _id : clave_emitida, value: resultado_reduce}
![Page 59: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/59.jpg)
Map
var map = function() { var words = this.text.split(" ");
for (var i = 0; i < words.length; i += 1){ for (var j = i; j < words.length; j += 1){ // Slice [inclusive, exclusive) sub_words = words.slice(i, j + 1); sub_sentence = sub_words.join(" "); emit(sub_sentence, sub_words.length * sub_words.length); } }};
![Page 60: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/60.jpg)
Map
Entrada:
{ text : “hola que tal”}
Se emite:
hola, 1 hola que, 4 hola que tal, 9 que tal, 4 que, 1 tal, 1
![Page 61: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/61.jpg)
Reduce
var reduce = function(key, emits) { var score = 0; for (var i in emits){ score += emits[i]; } return score;};
![Page 62: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/62.jpg)
Ejecución
Ejecución:
db.tweet.mapReduce(map, reduce, {"out" : "TTs"})
Consulta:
db.TTs.find().sort({value: -1}).limit(10)
![Page 63: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/63.jpg)
Finalize
• Reducir de palabras (preposiciones, conjunciones, etc)
• Filtrado de trending topics que están contenidos en otros
![Page 64: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/64.jpg)
Map Reduce Spring Data /** * Ejemplo de MapReduce */ public void ejemplo7() { MapReduceOptions opts = new MapReduceOptions(); opts.outputCollection("TT"); opts.limit(15); MapReduceResults<TrendingTopic> results = mongoTemplate.mapReduce("tweets", "classpath:map.js", "classpath:reduce.js", opts, TrendingTopic.class); }
![Page 65: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/65.jpg)
Map Reduce Spring Data
@Document(collection = "TT")public class TT {
@Id private String id;
private float value;
}
@Repositorypublic interface TrendingTopicRepository extends MongoRepository<TT, String> {
}
/** * Consultando resultado del MapReduce */ public void ejemplo8() { Page<TT> tt = trendingTopicRepository.findAll(new PageRequest(0, 10, new Sort(Direction.DESC, "value"))); logger.info("Trending topics found: " + tt.getNumberOfElements()); }
![Page 66: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/66.jpg)
Retweets
• En twitter es un poco caótico (RT, via ...)
• Insertar tweet indicando que es un retweet haciendo referencia al tweet original
• Modificar el tweet original para llevar una cuenta de retweets
![Page 67: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/67.jpg)
Otros usos en aplicaciones
• Analytics
• Logs
• Minería de twitter
![Page 68: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/68.jpg)
¿Preguntas?
???? ?
??
![Page 69: Seminario mongo db springdata 10-11-2011](https://reader034.vdocuments.net/reader034/viewer/2022052504/54b79a984a795969608b4659/html5/thumbnails/69.jpg)
Referencias
• MongoDB: The definitive guide
• 50 Tips and Tricks for MongoDB Developers
• Spring Data MongoDB
• Código de los ejemplos Spring Data