背景描述:
一个列表页面,为了优化查询效率,将数据按照一行一行直接存储在mongodb中,来进行分页查询。版本迭代后新增需求:可以自定义排序,按照某一项的值进行降序或者升序排序。而我们需要排序的字段都在记录的data数组对象里,如何实现根据嵌套数组中某一个字段排序呢?
解决方案:
经过一番搜索了解到mongodb的聚合管道技术,它允许我们通过一系列操作进行筛选,转换,分组,计算等等操作生成最终符合需求的聚合结果。
db.T_VOC_DATA_JGZHVOC000009.aggregate([
//根据code筛选出有该排序字段的记录
{
"$match":{
data:{$elemMatch:{"code":"a24112"}}
}
},
//查出id,mn,datatime,data字段
//并引入order字段,它的值时data数组中第一个满足code匹配的元素
{
"$project":{
"_id":1,
"mn":1,
"dataTime":1,
"data":1,
"order":{$arrayElemAt:[{
"$filter":{
"input":"$data",
"as":"item",
"cond":{
"$eq":[ "$$item.code", "a24112" ]
}
}
},0]}
}
},
//添加一个新字段order_no,值是上面筛选的order的value字段,该字段用于排序
{
"$addFields":{
"order_no":{$toDouble:"$order.value"}
}
},
//重写选择要查询的字段
{
"$project":{
"_id":1,
"mn":1,
"dataTime":1,
"data":1,
"order_no":1
}
},
//排序
{
"$sort":{
order_no:-1
}
}
],{allowDiskUse: true}).limit(100);