gpt4 book ai didi

node.js - MongoDB 聚合 : Sorting by existing values first

转载 作者:可可西里 更新时间:2023-11-01 09:28:40 37 4
gpt4 key购买 nike

我的用户有这个字段:

interestedIn: [{
type: String,
enum: [
'art',
'sport',
'news',
'calture',
...
],
}],

我的视频有这个字段:

categories: [{
type: String,
enum: [
'art',
'sport',
'news',
'calture',
...
],
}],

所以我需要一个具有以下条件的视频查询:

  • 首先查询所有视频并按 req.user.interestedIn 中的值排序。
  • 其余与 req.user.interestedIn 不匹配的视频排在最后。

我已经完成了上述查询:

Video.aggregate([

{ '$match': {}},
{ '$unwind': '$categories' },
{ '$match': {categories: {$in: req.user.interestedIn}}},
{ '$group': {
'_id': '$categories',
'categories': { '$push': '$categories' }
}},
{ '$sort': { 'categories': 1 } }
])

这是结果:

   "videos": [
{
"_id": "art",
"categories": [
"art",
"art",
"art",
"art",
"art",
"art",
"art",
"art",
"art",
"art",
"art",
"art",
"art",
"art"
]
},
{
"_id": "news",
"categories": [
"news",
"news",
"news",
"news",
"news",
"news",
"news",
"news",
"videos": [
{
"_id": "art",
"categories": [
"art",
"art",
"art",
"art",
"art",
"art",
"art",
"art",
"art",
"art",
"art",
"art",
"art",
"art"
]
},
{
"_id": "news",
"categories": [
"news",
"news",
"news",
"news",
"news",
"news",
"news",
"news",
"news",
"news",
"news",
"news",
"news",
"news"
]
}
]
}

最佳答案

您可以使用 $setIntersection 提取匹配元素,然后使用 $size 计算匹配项。

$sort 根据匹配次数降序排列文档。

有点像

Video.aggregate([ 
{"$addFields":{ "numofmatches":{"$size":{"$setIntersection":["$categories", req.user.interestedIn]}}}},
{"$sort":{"numofmatches":-1}}
])

关于node.js - MongoDB 聚合 : Sorting by existing values first,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52834607/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com