对MongoDB聚合查询进行排序

时间:2017-09-27 22:20:47

标签: mongodb sorting aggregate

我正在尝试从集合中对数据进行排序。我可以使用数字和布尔值进行排序。在我的情况下,我想要使用看起来像整数的参数排序,但它在数据库中保存为字符串。

注意:我无法将 ItemRef 更改为数据库中的整数数据类型。

mongo集合中的数据:

{
    "_id":ObjectId("56ccd6b5267ecf0528008e80"),
    "UserId":ObjectId("56ccd6b5267ecf0528008e06"),
    "ItemRef":"AA008",
    "Name":"Sample12"
},
{
    "_id":ObjectId("56ccd6b5267ecf0528008e95"),
    "UserId":ObjectId("56ccd6b5267ecf0528008e06"),
    "ItemRef":"560",
    "Name":"Sample"
},
{
    "_id":ObjectId("56ccd6b5267ecf0528008e90"),
    "UserId":ObjectId("56ccd6b5267ecf0528008e06"),
    "ItemRef":"5010",
    "Name":"Sample1"
},
{
    "_id":ObjectId("56ccd6b5267ecf0528008e91"),
    "UserId":ObjectId("56ccd6b5267ecf0528008e06"),
    "ItemRef":"5060",
    "Name":"Sample2"
},
{
    "_id":ObjectId("56ccd6b5267ecf0528008e92"),
    "UserId":ObjectId("56ccd6b5267ecf0528008e06"),
    "ItemRef":"1080",
    "Name":"Sample4"
}

查询:

 db.parrot.users.aggregate([
         {$match:{ "UserId" : ObjectId("56ccd6b5267ecf0528008e06")},
         {$sort:{"ItemRef":1}}
 ])

不是使用 ItemRef

进行排序

预期结果:

{
    "_id":ObjectId("56ccd6b5267ecf0528008e95"),
    "UserId":ObjectId("56ccd6b5267ecf0528008e06"),
    "ItemRef":"560",
    "Name":"Sample"
},
{
    "_id":ObjectId("56ccd6b5267ecf0528008e92"),
    "UserId":ObjectId("56ccd6b5267ecf0528008e06"),
    "ItemRef":"1080",
    "Name":"Sample4"
}
{
    "_id":ObjectId("56ccd6b5267ecf0528008e90"),
    "UserId":ObjectId("56ccd6b5267ecf0528008e06"),
    "ItemRef":"5010",
    "Name":"Sample1"
},
{
    "_id":ObjectId("56ccd6b5267ecf0528008e91"),
    "UserId":ObjectId("56ccd6b5267ecf0528008e06"),
    "ItemRef":"5060",
    "Name":"Sample2"
},
{
    "_id":ObjectId("56ccd6b5267ecf0528008e80"),
    "UserId":ObjectId("56ccd6b5267ecf0528008e06"),
    "ItemRef":"AA008",
    "Name":"Sample12"
}

2 个答案:

答案 0 :(得分:0)

零填充可以解决问题。例如,存储560为0560。但它仍然是黑客。我不认为如果将mongo存储为字符串,它可以将其排序为数字。

答案 1 :(得分:0)

-如果需要结果,请尝试执行此查询

db.parrot.aggregate([
         {$match:{ "UserId" : ObjectId("56ccd6b5267ecf0528008e06")}},
         {$sort:{"ItemRef":1}}
 ],{ collation: { locale: "en_US", numericOrdering: true } });