* Básicamente estoy tratando de ordenar objetos por su puntuación en la última hora.MongoDB MapReduce actualización en el lugar cómo
Estoy tratando de generar una suma de votos por hora para los objetos en mi base de datos. Los votos están integrados en cada objeto. El esquema de objetos se ve así:
{
_id: ObjectId
score: int
hourly-score: int <- need to update this value so I can order by it
recently-voted: boolean
votes: {
"4e4634821dff6f103c040000": { <- Key is __toString of voter ObjectId
"_id": ObjectId("4e4634821dff6f103c040000"), <- Voter ObjectId
"a": 1, <- Vote amount
"ca": ISODate("2011-08-16T00:01:34.975Z"), <- Created at MongoDate
"ts": 1313452894 <- Created at timestamp
},
... repeat ...
}
}
Esta pregunta está realmente relacionado con una pregunta que hice un par de días atrás Best way to model a voting system in MongoDB
¿Cómo puedo (puedo?) Ejecutar un comando MapReduce para hacer lo siguiente :
- sólo se ejecutan en objetos con votó recientemente-= true o por hora-score> 0.
- Calcular la suma de los votos creados en la última hora.
- Actualizar puntuación por hora = la suma calculada anteriormente, y recientemente votada = falsa.
También leí here que puedo realizar una MapReduce en el esclavo DB ejecutando db.getMongo(). SetSlaveOk() antes del comando M/R. ¿Podría ejecutar el reductor en un esclavo y actualizar el DB maestro?
¿Son posibles las actualizaciones in situ con Mongo MapReduce?
Ok, todo tiene sentido hasta el paso 3. No entiendo muy bien cómo tomar la suma reducida de puntaje por hora y actualizar los objetos relevantes en la colección. Supongamos que tenemos una colección de comentarios con el esquema en mi pregunta y me gustaría actualizar todos los puntajes por hora de comentarios relevantes a las nuevas sumas reducidas. El puntaje por hora es un parámetro en objetos de comentario, no algo en una colección separada. ¿Como podría hacerlo? – Marc
Ah, ya veo, ¿desea actualizar el campo 'hourly-score' para que sea la suma de las cantidades de votos (campo' votes.a') con la salida del mapa-reduce? No creo que puedas hacer esto en línea con map-reduce, pero definitivamente puedes hacer un paso de post-procesamiento que use la salida map-reduce para actualizar cualquier colección que desees. – dcrosta
Hmm ok. Desde una base de datos relacional, esta es una tarea bastante simple. Básicamente, todo lo que me gustaría hacer es ordenar los objetos por puntuación en la última hora. En un relacional, mantendría los puntajes en una tabla separada. Luego selecciono de la tabla de objetos, unir tabla de puntajes, sumar los puntajes en la última hora y ordenar por esa suma. Quizás cualquiera a. mongo simplemente no es bueno para esto o b. ¿Organizo mis objetos/votos incorrectamente? – Marc