如何在 MongoDb 中执行不区分大小写的聚合分组?

pul*_*hal 6 mongodb aggregation-framework

假设我想按Description字段聚合和分组 MongoDb 中的文档。

运行以下(默认区分大小写):

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

在我的样本数据上给了我 1000 个结果,这很好。

但现在我希望运行不区分大小写的查询(使用$toLower)应该给我少于或等于 1000 个结果:

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

但相反,我得到了 1000 多个结果。那不可能是对的,对吗?更常见的条目应该组合在一起以产生更少的总分组数......我认为。

那么可能我的聚合查询是错误的!这让我想到了我的问题:

MongoDb 中不区分大小写的聚合分组应该如何执行?

dni*_*ess 8

您对不区分大小写分组的方法是正确的,所以也许您的观察不是?;)

试试这个例子:

// insert two documents
db.getCollection('test').insertOne({"name" : "Test"}) // uppercase 'T'
db.getCollection('test').insertOne({"name" : "test"}) // lowercase 't'

// perform the grouping
db.getCollection('test').aggregate({ $group: { "_id": { $toLower: "$name" }, "count": { $sum: 1 } } }) // case insensitive
db.getCollection('test').aggregate({ $group: { "_id": "$name", "count": { $sum: 1 } } }) // case sensitive
Run Code Online (Sandbox Code Playgroud)

您可能在某处打错了字?

文件还指出

$toLower 仅对 ASCII 字符字符串具有明确定义的行为。

也许这就是你在这里咬人的原因?