9
votes

Convertir une chaîne en nombre en projection MongoDB

J'ai une collection de documents qui ont une valeur qui est connue pour être un numéro, mais il est stocké sous forme de chaîne. Il est hors de mon contrôle pour changer le type du champ, mais je veux utiliser ce champ dans une agrégation (par exemple, en moyenne il).

Il semble que je devrais utiliser une projection avant le regroupement, et cette projection convertir le champ en fonction des besoins. Je ne peux pas sembler obtenir la syntaxe juste -. Tout ce que j'essaie soit me donne NaN, ou le nouveau champ est tout simplement absent de l'étape suivante dans l'agrégation p>

$group {
    score: {
        $avg: '$valueasnumber'
    }
}


3 commentaires

A partir de MongoDB 2.6, vous êtes hors de la chance. Il n'y a pas d'options nombre disponibles dans l'analyse syntaxique le cadre d'agrégation. Si le champ représente un nombre, il faut vraiment être stocké sous la forme d'un numéro; vous pourriez peut-être ajouter un autre champ qui est la forme numérique du nombre? Vous pouvez également envisager map / reduce.


Merci pour tout le monde commentaires. J'essaie à la fois des approches pour voir ce qui fonctionne le mieux. Il semble que le cadre d'agrégation a de meilleures performances que map / reduce, il pourrait être utile de maintenir le deuxième champ (en nombre), de sorte que l'agrégation peut être utilisé comme prévu.


double possible de comment convertir chaîne en valeurs numériques dans MongoDB


3 Réponses :


3
votes

L'un des moyens que je peux penser est d'utiliser un javascript shell mongo pour modifier le document en ajoutant un nouveau champ numérique, valuesasnumber (conversion de nombre de champ existant de chaîne « valeur ») dans le document existant ou dans le nouveau document . Ensuite, en utilisant ce champ numérique pour les calculs supplémentaires.

db.numbertest.aggregate([{$group : 
   {_id : null, 
    "score" : {$avg : "$valueasnumber"}
   }
}]);


0 commentaires

2
votes

L'opération principale consiste à convertir la valeur de chaîne de caractères du numéro qui ne peut pas manipulé dans opération de pipeline total actuellement.
MapReduce est une alternative comme ci-dessous. xxx


0 commentaires