首页 > 解决方案 > 我需要按字段对嵌套集合进行排序,并按文档字段切片和分组输出结果

问题描述

我有收藏。

{
  "cityIsoCode": "LED",
  "flights": [{
    "departureDate": "2019-01-03",
    "fromIsoCode": "MOW",
    "returnDate": "2019-01-09",
    "totalPrice": 829
  },{
    "departureDate": "2019-01-03",
    "fromIsoCode": "MOW",
    "returnDate": "2019-01-04",
    "totalPrice": 467
  }, {
    "departureDate": "2019-01-03",
    "fromIsoCode": "MOW",
    "returnDate": "2019-01-05",
    "totalPrice": 838
  }]
}
  {
    "cityIsoCode": "KZN",
    "flights": [{
      "departureDate": "2019-01-03",
      "fromIsoCode": "MOW",
      "returnDate": "2019-01-04",
      "totalPrice": 518
    }, {
      "departureDate": "2019-01-03",
      "fromIsoCode": "MOW",
      "returnDate": "2019-01-03",
      "totalPrice": 551
    }, {
      "departureDate": "2019-01-03",
      "fromIsoCode": "MOW",
      "returnDate": "2019-01-10",
      "totalPrice": 765
    }]
  }

我需要按字段“totalPrice”对嵌套集合“航班”进行排序,并输出按文档字段“cityIsoCode”分组的“航班”的 $slice: [1,1]。

我需要得到这个结果:

{
	"cityIsoCode" : "LED",
	"flights" : [
		{
		  "departureDate": "2019-01-03",
      "fromIsoCode": "MOW",
      "returnDate": "2019-01-09",
      "totalPrice": 829
		}
	]
}
{
	"cityIsoCode" : "KZN",
	"flights" : [
		{
      "departureDate": "2019-01-03",
      "fromIsoCode": "MOW",
      "returnDate": "2019-01-03",
      "totalPrice": 551
    }
	]
}

我可以在 mongo 中执行此操作吗?如何对其进行正确查询?

标签: mongodb

解决方案


您可以使用聚合管道来执行此操作

db.t45.aggregate([
    {$unwind : "$flights"}, 
    {$sort : {"flights.totalPrice":1}}, 
    {$group : {_id : {_id : "$_id", cityIsoCode : "$cityIsoCode"}, flights : {$push : "$flights"}}}, 
    {$project : {_id : "$_id._id", cityIsoCode : "$_id.cityIsoCode", flights : {$slice : ["$flights", 1,1]}}}
]).pretty()

这是mongo 3.4.10版本

我相信在更高的版本中我们可以直接对数组元素进行排序,我们可以避免$unwind,$sort并且$group$sort使用数组元素字段和$project所需的字段


推荐阅读