如何在不使用 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
这是我的示例数据,我有一个用户 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