如何在不使用 unwind 的情况下使用 mongodb 中的数组元素对数据进行排序

how can i sort data with a array element in mongodb without using unwind

这是我的示例数据,我有一个用户 ID 和一个数组“watchHistory”,“watchHistory”数组包含用户观看的视频列表:

    {
        "_id": "62821344445c30b35b441f11",
        "userId": 579,
        "__v": 0,
        "watchHistory": [
            {
                "seenTime": "2022-05-23T08:29:19.781Z",
                "videoId": 789456,
                "uploadTime": "2022-03-29T12:33:35.312Z",
                "description": "Biography of Indira Gandhi",
                "speaker": "andrews",
                "title": "Indira Gandhi",
                "_id": "628b45df775e3973f3a670ec"
            },
            {
                "seenTime": "2022-05-23T08:29:39.867Z",
                "videoId": 789455,
                "uploadTime": "2022-03-31T07:37:39.712Z",
                "description": "What are some healthy food habits to stay healthy",
                "speaker": "morris",
                "title": "Healthy Food Habits",
                "_id": "628b45f3775e3973f3a670"
            },
            
        ]
    }

我需要匹配 userId,然后我需要用“watchHistory.seenTime”对其进行排序,seenTime 字段指示用户何时观看视频。所以我需要将最后观看的视频排序为列表中的第一位。 我没有使用 unwind 的权限,所以任何人都可以帮助我。谢谢。

如果您使用的是 MongoDB 5.2 及更高版本,则可以在聚合管道中使用 $sortArray 运算符。您的管道应如下所示:

db.collection.aggregate(
  [
    {"$match": 
      { _id: '62821344445c30b35b441f11' }
    },
    {
      "$project": {
        _id: 1,
        "userId": 1,
        "__v": 1,
        "watchHistory": {
          "$sortArray": { input: "$watchHistory", sortBy: { seenTime: -1 }}
        }
      }
    }
  ]
);

请根据您需要过滤的键和值修改“$match”阶段的过滤器。这是 link 到 documentation

如果不使用 unwind,则无法通过聚合管道完成此操作,但您可以使用 update 方法和 $push 运算符,作为解决方法,如下所示:

db.collection.update({
  _id: "62821344445c30b35b441f11"
},
{
  $push: {
    watchHistory: {
      "$each": [],
      "$sort": {
        seenTime: -1
      },
    }
  }
})

请查看工作示例here