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

Kun*_*nok 5 mongodb

我有包含如下对象的集合:

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

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

Dan*_*ney 14

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

db.collection.find()
  .sort({internalDate: 1})
  .collation({locale: "en_US", numericOrdering: true})
Run Code Online (Sandbox Code Playgroud)

  • 是的,这可行,但是在 100 万以上的文档上尝试一下。它会使你的查询速度变慢。它不能很好地扩展。转换为 int 并在必要时再转换回来的性能更高。 (2认同)

Alb*_*les 10

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

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


Niz*_*zam 6

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

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

如果您使用 mongoose-paginate 包进行服务器端分页..所以不要使用此包,仅使用mongoose-paginate-v2进行服务器端分页。这个包用于nodejs端