簡體   English   中英

貓鼬:排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM