从猫鼬获取嵌套数组,并按createdAt排序

时间:2020-10-02 20:37:53

标签: mongodb mongoose

这是我的数据模型

[
  {
    "_id": "5f7753db63cce11af6a7146e",
    "completedExams": [
      {
        "_id": "5f778650cbc02f43e25064e0",
        "createdAt": "2020-10-02T19:58:08.146Z",
        "exam": "Test-1",
        "score": 2
      },
      {
        "_id": "5f77868ccbc02f43e25064e2",
        "createdAt": "2020-10-02T19:59:08.493Z",
        "exam": "Test-2",
        "score": 1
      }
    ]
  }
]

我尝试过

User.findOne({"_id": "5f7753db63cce11af6a7146e"}).sort({'completedExams.createdAt': -1}).select({'completedExms.createdAt': 1, 'completedExams.score': 1, 'completedExams.exam': 1});

我从那个查询中得到这个

[
  {
    "_id": "5f7753db63cce11af6a7146e",
    "completedExams": [
      {
        "createdAt": "2020-10-02T19:58:08.146Z",
        "exam": "Test-1",
        "score": 2
      },
      {
        "createdAt": "2020-10-02T19:59:08.493Z",
        "exam": "Test-2",
        "score": 1
      }
    ]
  }
]

但是我想对它进行排序

    [
      {
        "createdAt": "2020-10-02T19:59:08.493Z",
        "exam": "Test-2",
        "score": 1
      },
      {
        "createdAt": "2020-10-02T19:58:08.146Z",
        "exam": "Test-1",
        "score": 2
      }
    ]

2 个答案:

答案 0 :(得分:0)

尝试一下:

db.User.aggregate([
  { $match: { _id: ObjectId("5f7753db63cce11af6a7146e") } },
  { $unwind: "$completedExams" },
  { $sort: { "completedExams.createdAt": -1 } },
  { $replaceRoot: { newRoot: "$completedExams" } }
])

对于这些功能,您必须使用聚合框架,即findOne不起作用。

但是许多操作也接受聚合管道作为输入参数。

请参见Mongo Playground

答案 1 :(得分:0)

使用聚合框架按降序对数组进行排序。

User.aggregate([
  // Initial document match
  {
    $match: {
      _id: ObjectId('5f7753db63cce11af6a7146e')
    }
  },
  // Expand the completedExams array into a stream of documents
  {
    $unwind: '$completedExams'
  },
  // Sort in descending order
  {
    $sort: {
      'completedExams.createdAt': -1
    }
  },
  {
    $group: {
      _id: '$_id',
      completedExams: {
        $push: '$completedExams'
      },
    }
  }
])