我有一个问题:
ownUnnamedPages = Entries.find( { author : this.userId, title : {$regex: /^unnamed-/ }}, {sort: { title: 1 }}).fetch()
返回以下数组:
[ {
title: 'unnamed-1',
text: '<p>sdaasdasdasd</p>',
tags: [],
_id: 'Wkxxpapm8bbiq59ig',
author: 'AHSwfYgeGmur9oHzu',
visibility: 'public' },
{
title: 'unnamed-10',
text: '',
author: 'AHSwfYgeGmur9oHzu',
visibility: 'public',
_id: 'aDSN2XFjQPh9HPu4c' },
{
title: 'unnamed-2',
text: '<p>kkhjk</p>',
tags: [],
_id: 'iM9FMCsyzehQvYGKj',
author: 'AHSwfYgeGmur9oHzu',
visibility: 'public' },
{
title: 'unnamed-3',
text: '',
tags: [],
_id: 'zK2w9MEQGnwsm3Cqh',
author: 'AHSwfYgeGmur9oHzu',
visibility: 'public' }]
问题是它似乎对第一个数字字符进行排序,因此它认为正确的顺序是1,10,2,3等等.... 我真正想要的是它对整个数字部分进行排序,以便最终得到10个。
我不希望通过为数字添加额外的数字(如01或001)来实现此目的。
我该怎么做?
答案 0 :(得分:16)
MongoDB无法按存储为字符串的数字排序。您必须将数字作为整数存储在其自己的字段中,使用前导零填充,或者在从数据库返回结果后对结果进行排序。
答案 1 :(得分:5)
如果您填写数字,您将能够以正确的顺序搜索为字符串,因此而不是0,1,2,3,4,5,6,7,8,9,10,11。 .. 使用01,02,03,04,05,06,07,08,09,10,11 ...... 并且字符串搜索将按顺序返回它们。
答案 2 :(得分:5)
您可以使用
db.collectionName.find().sort({title: 1}).collation({locale: "en_US", numericOrdering: true})
numericOrdering标志是布尔值,并且是可选的。用于确定将数字字符串比较为数字还是字符串的标志。 如果为true,则比较为数字;否则为0。即“ 10”大于“ 2”。 如果为false,则比较为字符串;否则为false。即“ 10”小于“ 2”。 默认值为false。
答案 3 :(得分:0)
在mongo中是不可能的(在ascii中对字符串进行排序),但是在从集合中获取所有文档之后,可以使用以下函数进行排序
const sortString = (a, b) => {
const AA = a.title.split('-');
const BB = b.title.split('-');
if (parseInt(AA[1], 10) === parseInt(BB[1], 10)) {
return 0;
}
return (parseInt(AA[1], 10) < parseInt(BB[1], 10)) ? -1 : 1;
};
document.sort(sortString);
答案 4 :(得分:0)
就我而言,我们使用聚合。方法是使用字符串的长度进行排序。仅当文本部分始终相同(在您的情况下为未命名)时才有效
export class DrawerItemDirective {
constructor(public @Inject(FilterDrawerComponent) drawer) {}
ngAfterViewInit() {
const prop = this.drawer.propertyIWantToAccess;
this.doStuff(prop);
}
}
现在我们使用长度排序,第二种将使用内容。
示例:
第一种排序方式将ID依次排列: 2 , 7 , 1 , 30 。然后,第二种排序将以正确的顺序排列ID: 1 , 2 , 7 , 30 。< / p>
答案 5 :(得分:0)
mongo文档说您可以使用归类来实现此目标 正如@Eugene Kaurov所说的,您可以使用
.collation({locale: "en_US", numericOrdering: true})
这是官方文档: mongo ref
请注意,现在接受的答案不正确