我的集合包含以下对象:
{
"_id" : ObjectId("57f00cf47958af95dca29c0c"),
"id" : "...",
"threadId" : "...",
"ownerEmail" : "...@...",
"labelIds" : [
...
],
"snippet" : "...",
"historyId" : "35699995",
"internalDate" : "1422773000000",
"headers" : {
"from" : "...@...",
"subject" : "....",
"to" : "...@..."
},
"contents" : {
"html" : "...."
}
}
当访问对象时,我想通过iternalDate值对它们进行排序,该值应该是整数,但它是一个字符串。即使这些是字符串,有没有办法在提取时对它们进行排序?按字母顺序?或者有没有办法将它们无痛地转换为整数?
答案 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})