2017-09-08 4 views
2

Disons que je veux regrouper et regrouper par documents dans MongoDb par le champ Description.Comment effectuer un regroupement d'agrégation insensible à la casse dans MongoDb?

exécutant la commande suivante (sensible à la casse par défaut):

db['Products'].aggregate(
    { $group: { 
     _id: { 'Description': "$Description" }, 
     count: { $sum: 1 }, 
     docs: { $push: "$_id" } 
    }}, 
    { $match: { 
     count: { $gt : 1 } 
    }} 
); 

sur mes données échantillon me donne 1000 résultats, ce qui est bien.

Mais maintenant j'attendre à ce que l'exécution d'un insensible à la casse requête (en utilisant $toLower) devrait me donner inférieur ou égal à 1000 résultats:

db['Products'].aggregate(
    { $group: { 
     _id: { 'Description': {$toLower: "$Description"} }, 
     count: { $sum: 1 }, 
     docs: { $push: "$_id" } 
    }}, 
    { $match: { 
     count: { $gt : 1 } 
    }} 
); 

Mais au lieu que j'obtenir plus de 1000 résultats. Cela ne peut pas être vrai, n'est-ce pas? Les entrées les plus communes devraient être regroupées pour produire moins de nombre total de groupements ... Je pense.

Alors, probablement, ma requête d'agrégation est erronée! Ce qui m'amène à ma question:

Comment le groupement d'agrégation insensible à la casse dans MongoDb devrait-il être effectué?

+0

Si vous pensez qu'il y a un problème, vous devez demander d'une manière qui reproduit le problème. Vous devriez donc être en mesure d'afficher un petit jeu de données dans lequel '$ toLower' n'a pas l'effet désiré. Ce processus a généralement deux résultats. 1. Montre un vrai bug d'une manière reproductible. 2. Fait ressortir autre chose est le problème que vous ne pensiez pas être un problème. Voir [Comment créer un exemple minimal, complet et vérifiable] (https://stackoverflow.com/help/mcve), dont BTW est essentiellement le même concept que le test unitaire. Doit être reproductible. –

Répondre

1

Vous approchez du regroupement insensible à la casse est correct alors peut-être que votre observation ne l'est pas? ;)

Essayez cet exemple:

db.getCollection('test').insertOne({"name" : "Test"}) 
db.getCollection('test').insertOne({"name" : "test"}) 

db.getCollection('test').aggregate({ $group: { "_id": { $toLower: "$name" }, "count": { $sum: 1 } } }) 
db.getCollection('test').aggregate({ $group: { "_id": "$name", "count": { $sum: 1 } } }) 

Vous avez sans doute une faute de frappe quelque part?

Le documentation indique également que

$ toLower a seulement un comportement bien défini pour les chaînes de caractères ASCII.

Peut-être que c'est ce qui vous mord ici?

+0

Merci @dnickless ... Je crains qu'il y ait quelque chose d'intéressant dans mes données qui fait que cette supposition tombe à plat sur son visage ... une sorte de cornercase peut-être ... Je suppose que sans partager ces données pour que d'autres aient le même WTF moment, cela ne deviendra pas une question significative: / – pulkitsinghal