J'ai des documents 25k (4 Go en raw json) de données que je veux effectuer quelques opérations javascript pour le rendre plus accessible à mon consommateur de données fin (R
), et je voudrais trier de "contrôle de version" ces changements en ajoutant une nouvelle collection pour chaque changement, mais je ne peux pas comprendre comment map/reduce
sans le reduce
. Je veux un mappage de document en tête-à-tête - je commence avec 25 356 documents en collection_1
, et je veux finir avec 25 356 documents en collection_2
.mongoDB carte/réduire moins réduire
Je peux pirater avec ceci:
var reducer = function(key, value_array) {
return {key: value_array[0]}
}
Et puis appelez comme:
db.flat_1.mapReduce(mapper, reducer, {keeptemp: true, out: 'flat_2'})
(Mes Mapper uniquement les appels émettent une fois, avec une chaîne comme premier argument et le document final comme deuxième, c'est une collection de ces deuxièmes arguments que je veux vraiment.)
Mais cela semble bizarre et je ne sais pas pourquoi cela fonctionne même, puisque mon appel emit
guments dans mon mapper ne sont pas équivalents à l'argument return de mon reducer
. De plus, je me retrouve avec un document comme
{
"_id": "0xWH4T3V3R",
"value": {
"key": {
"finally": ["here"],
"thisIsWhatIWanted": ["Yes!"]
}
}
}
ce qui semble inutile.
En outre, un curseur qui effectue ses propres insertions n'est même pas un dixième aussi rapide que mapReduce
. Je ne connais pas suffisamment MongoDB pour l'évaluer, mais je suppose que c'est à peu près 50x
plus lent. Existe-t-il un moyen de parcourir un curseur en parallèle? Je me fous si les documents dans mon collection_2
sont dans un ordre différent de ceux dans collection_1
.
La raison pour laquelle cela fonctionne est parce que votre émission et réducteur appel * sont * la même chose. Puisque vous utilisez la valeur [0] comme sortie de votre réducteur, alors il doit être exactement le même parce que vous ne l'avez pas changé (il ne fait que traverser votre réducteur). – null