到目前为止,我一直在使用此代码来查找我的文档,然后对它们进行排序:
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)
};