mongodb c#案例不敏感的排序和索引



到目前为止,我一直在使用此代码来查找我的文档,然后对它们进行排序:

        var options = new FindOptions
        {
            Modifiers = new BsonDocument("$hint", "PathTypeFilenameIndex")
        };
        return await Collection
            .Find(f => f.Metadata["path"] == path, options)
            .SortBy(f => f.Metadata["type"])
            .ThenBy(f => f.Filename)
            .ToListAsync();

我有一个带有路径和类型字段的元数据字段的类,同类也有一个文件名字段。我想要用类型和文件名排序的元数据内的所有文档。

一个示例结果将是按这样的名称字段订购的文档列表:

a, Ab, B, c, D

不幸的是,我得到了这样的东西:

Ab, B, D, a, c

这是因为mongodb通过简单的二进制比较对数据进行分类,其中'a<'a'因为其ASCII代码。

所以我的问题是:有没有办法使案例不敏感并继续使用" $提示"?

我将选项传递给查找方法应该告诉mongoDB使用哪个索引。我找到了这篇文章:mongodb和c#:案例不敏感的搜索,但是这里的方法不起作用,我无法告诉mongodb使用哪个索引。

我认为您可以使用$addFields$toLower(将filename转换为临时字段中的小写(,而$sort将聚合管道使用,而不论情况如何

在mongodb shell中,您会写这样的东西:

db.collection.aggregate([{
    $addFields : {
        "lowercaseFileName" : {
            $loLower : "$fileName"
        }
    },{
        $sort : {
            "metadata.type" : 1,
            lowercaseFileName : 1
        }
    }
}])

请在C#中编写类似的代码,看看它是否有效。我不知道C#,否则我会给您确切的查询,但我不能。

这个想法是将文件名转换为小写,将其保存在临时字段中,使用addfields和该字段排序。

希望这对您有所帮助。

在此处阅读更多有关$ addfields,$ tolower的信息。

update

对于想要C#的工作代码的人,感谢 @kaloyan-manev

您可以使用以下方式:

return await Collection.Aggregate()
    .Match(f => f.Metadata["path"] == path) 
    .AppendStage<BsonDocument>(new BsonDocument("$addFields", new BsonDocument("lowercaseFileName", new BsonDocument("$toLower", "$filename")))) 
    .AppendStage<GridFSFileInfo>(new BsonDocument("$sort", new BsonDocument { {"metadata.type", 1}, {"lowercaseFileName", 1} }))
    .ToListAsync();

您是否尝试设置CollationsTrenght = 2?

您的代码将是类似的,您需要的只是在FindObject中设置整理:

 var options = new FindOptions
    {
        Modifiers = new BsonDocument("$hint", "PathTypeFilenameIndex"),
        Collation = new Collation("en", strength: CollationStrength.Secondary)
    };

最新更新