Mongo按字符串值排序,实际上是数字

时间:2016-10-02 08:37:56

标签: mongodb

我的集合包含以下对象:

{ 
    "_id" : ObjectId("57f00cf47958af95dca29c0c"), 
    "id" : "...", 
    "threadId" : "...", 
    "ownerEmail" : "...@...", 
    "labelIds" : [
       ...
    ], 
    "snippet" : "...", 
    "historyId" : "35699995", 
    "internalDate" : "1422773000000", 
    "headers" : {
        "from" : "...@...", 
        "subject" : "....", 
        "to" : "...@..."
    }, 
    "contents" : {
        "html" : "...."
    }
}

当访问对象时,我想通过iternalDate值对它们进行排序,该值应该是整数,但它是一个字符串。即使这些是字符串,有没有办法在提取时对它们进行排序?按字母顺序?或者有没有办法将它们无痛地转换为整数?

6 个答案:

答案 0 :(得分:10)

在我看来,这里最好的解决方案是首先将其解析为整数。您可以使用javascript这样的简单脚本,使用节点的mongodb客户端:

db.collection.find({}, {internalDate: 1}).forEach(function(doc) {
    db.collection.update(
       { _id: doc._id },
       { $set: { internalDate: parseInt(doc.internalDate) } }
    )
})

答案 1 :(得分:10)

整理是你需要的......

$1 $2 $3

答案 2 :(得分:0)

我遇到了这个问题。我先使用字符串长度进行排序,然后再应用存储为字符串的数值类型。例如应该按照“ 1、3、29、100”的顺序对“ 1”,“ 100”,“ 20”,“ 3”进行排序。

    db.AllTours.aggregate([
    {
        $addFields : {
            "MyStringValueSize" : { $strLenCP: "$MyValue" }
        }
    },
    { 
        $sort : { 
            "MyStringValueSize" : 1,
            "MyValue" : 1
        } 
    }
    ]);

4.0版中有一个名为$toInt的新功能,可用于解析字符串然后进行排序。就我而言,我无法从3.6升级。

答案 3 :(得分:0)

您还可以使用聚合方法对实际上是字符串的数字进行排序。

 db.collection.aggregate([{
     $sort : {
          internalDate : 1
     }
 }], {
     collation: {
         locale: "en_US",
         numericOrdering: true
     }
 });

如果您使用mongoose-paginate软件包进行服务器端分页..请勿使用此软件包,请仅将 mongoose-paginate-v2 用于服务器端分页。该软件包用于nodejs端

答案 4 :(得分:0)

这是我的解决方案,对我有用

db.getCollection('myCollection').aggregate([
{
    $project: {
        newMonth: {
            $cond: { if: {
                $and: [
                    {$ne: ['$month', '10']},
                    {$ne: ['$month', '11']},
                    {$ne: ['$month', '12']},
                ]
            }, then: {$concat: ['0', '$month']}, else: '$month' }
        }
        }
    },

    {
        $sort: {newMonth: -1}
    }
])

答案 5 :(得分:0)

使用聚合,这对我有用。

db.collection.aggregate([<pipeline>]).collation({locale:"en_US", numericOrdering:true})