[英]How to make a MongoDB query sort on strings with -number postfix?
我有一個疑問:
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)來做到這一點。
我該怎么做?
您可以使用
db.collectionName.find().sort({title: 1}).collation({locale: "en_US", numericOrdering: true})
numericOrdering 標志是布爾值並且是可選的。 確定是將數字字符串作為數字還是作為字符串進行比較的標志。 如果為真,則作為數字進行比較; 即“10”大於“2”。 如果為假,則作為字符串進行比較; 即“10”小於“2”。 默認為假。
MongoDB 無法按存儲為字符串的數字進行排序。 您必須將數字作為整數存儲在其自己的字段中,用前導零填充,或者在從數據庫返回結果后對結果進行排序。
如果您 0 填充數字,您將能夠以正確的順序作為字符串進行搜索,而不是 0,1,2,3,4,5,6,7,8,9,10,11... 使用01,02,03,04,05,06,07,08,09,10,11... 字符串搜索將按順序返回它們。
mongo 文檔說你可以使用 Collation 來實現這個目標,因為@Eugene Kaurov 說你可以使用
.collation({locale: "en_US", numericOrdering: true})
這是官方文檔: mongo ref
並注意現在接受的答案不正確
在 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);
就我而言,我們使用聚合。 方法是使用字符串的長度進行排序; 僅當文本部分始終相同時才有效(在您的情況下未命名)
db.YourCollection.aggregate([
{
$addFields: {
"TitleSize": { $strLenCP: "$Title" }
}
},
{
$sort: {
"TitleIdSize": 1,
"Title": 1
}
}
]);
現在我們使用長度進行排序,第二次排序將使用內容。
例子:
第一種排序將按照以下順序放置 id: 2 , 7 , 1 , 30 。 然后第二次排序會將 ids 以正確的順序排列: 1 , 2 , 7 , 30 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.