2017-09-08 3 views
2

MongoDbの文書をDescriptionフィールドで集約してグループ化したいとします。MongoDbで大文字と小文字を区別しない集約グループを実行する方法は?

次(大文字と小文字を区別デフォルトで)を実行している:私のサンプルデータに

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

罰金である、私の1000年の結果を提供します。

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

をしかし、その代わりに、私は1000の以上の結果を得る:

しかし、今、私は、大文字と小文字を区別しないクエリを実行している($toLowerを使用して)は1000の結果に私に以下を与えるべきであることを期待しています。それは正しいことができない、それはできますか?より一般的なエントリはグループ化されて、グループ化の数が少なくなるはずです。

それではおそらく私集計クエリは間違っています!これは私の質問に私をもたらします:

がどのようにMongoDBにグループ化する大文字と小文字を区別しない集約を実行すべきか?

+0

あなたは問題があると思うなら、あなたは、問題を再現するように依頼する必要があります。だから、あなたは '$ toLower'が望む効果を持たない小さなデータセットを表示できるはずです。このプロセスには通常2つの結果があります。 1.再現性のある方法で実際のバグを表示します。 2.実際にハイライトしたことは、あなたが問題ではないと思った問題です。 BTWは本質的にユニットテストと同じコンセプトである[最小限で完全かつ検証可能なサンプルの作成方法](https://stackoverflow.com/help/mcve)を参照してください。再現性が必要です。 –

答えて

1

あなたは、大文字と小文字を区別しないグループ化へのアプローチがある正しいので、おそらくあなたの観察はないでしょうか? ;)

は、この例を試してみてください。

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 } } }) 

あなたがどこかにタイプミスを有することができますか?

documentationもTOLOWERその

$を述べているだけASCII文字の文字列に対する明確に定義された振る舞いを持っています。

おそらく、それはここであなたを噛んだ何ですか?

+0

おかげ@dnickless ...私は多分...私は他の人のためのデータが同じWTFを持っていることを共有せず推測cornercaseのいくつかの並べ替え...この仮定はその顔に平らに落ちるために引き起こしている私のデータで興味深いものがある恐れ瞬間、これは意味のある質問にはなりません: – pulkitsinghal

関連する問題