[英]Mongoose: Sorting
什么是對集合中的以下文檔進行排序的最佳方法:
{"topic":"11.Topic","text":"a.Text"}
{"topic":"2.Topic","text":"a.Text"}
{"topic":"1.Topic","text":"a.Text"}
我使用以下內容
find.(topic:req.body.topic).(sort({topic:1}))
但是不起作用(因為字段是字符串而不是數字所以我得到):
{"topic":"1.Topic","text":"a.Text"},
{"topic":"11.Topic","text":"a.Text"},
{"topic":"2.Topic","text":"a.Text"}
但我想得到:
{"topic":"1.Topic","text":"a.Text"},
{"topic":"2.Topic","text":"a.Text"},
{"topic":"11.Topic","text":"a.Text"}
我在這里讀到另一篇文章,這將需要貓鼬沒有的復雜排序。 那么這個架構可能沒有真正的解決方案嗎?
非常感謝您的幫助
我建議你將你的topic
提交為type : Number
,並創建另一個字段topic_text
。
您的架構看起來像:
var documentSchema = new mongoose.Schema({
topic : Number,
topic_text : String,
text : String
});
普通文檔看起來像這樣:
{document1:[{"topic":11,"topic_text" : "Topic" ,"text":"a.Text"},
{"topic":2,"topic_text" : "Topic","text":"a.Text"},
{"topic":1,"topic_text" : "Topic","text":"a.Text"}]}
因此,您將能夠使用.sort({topic : 1})
,並獲得您想要的結果。 使用topic
值時,將topic_text
附加到它。
find(topic:req.body.topic).sort({topic:1}).exec(function(err,result)
{
var topic = result[0].topic + result[0].topic_text;//use index i to extract the value from result array.
})
如果您不希望(或者甚至不能)更改文檔的形狀以包含主題編號的數字字段,那么您可以使用聚合框架實現所需的排序。
以下管道基本上將主題字符串(如'11 .Topic')用點'。'分割。 然后在結果數組的第一部分前面加上固定數量的前導零,以便按這些字符串排序將導致“模擬”數字排序。
但請注意,此管道使用$split
和$strLenBytes
運算符,這些運算符非常新,因此您可能必須更新mongoDB實例 - 我使用的是版本3.3.10。
db.getCollection('yourCollection').aggregate([
{
$project: {
topic: 1,
text: 1,
tmp: {
$let: {
vars: {
numStr: { $arrayElemAt: [{ $split: ["$topic", "."] }, 0] }
},
in: {
topicNumStr: "$$numStr",
topicNumStrLen: { $strLenBytes: "$$numStr" }
}
}
}
}
},
{
$project: {
topic: 1,
text: 1,
topicNumber: { $substr: [{ $concat: ["_0000", "$tmp.topicNumStr"] }, "$tmp.topicNumStrLen", 5] },
}
},
{
$sort: { topicNumber: 1 }
},
{
$project: {
topic: 1,
text: 1
}
}
])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.