gpt4 book ai didi

javascript - Mongodb 按数组排序

转载 作者:行者123 更新时间:2023-12-03 00:36:28 31 4
gpt4 key购买 nike

有没有办法按给定数组排序?

像这样:

const somes = await SomeModel.find({}).sort({'_id': {'$in': [ObjectId('sdasdsd), ObjectId('sdasdsd), ObjectId('sdasdsd)]}}).exec()

我正在寻找一种获得解决方案的方法,获取集合的所有文档,并根据文档的 _id 与给定数组之一匹配进行排序。

一个例子:

我们有专辑收藏和歌曲收藏。在专辑集合中,我们存储属于专辑的歌曲的 ID。

我想获取歌曲,但如果歌曲在专辑中,请将它们放在数组前面。

我按如下方式解决了这个问题,但它看起来有点hacky:

const songs = await SongMode.find({}).skipe(limit * page).limit(limit).exec();
const album = await AlbumModel.findById(id).exec();

if(album) {
songArr = album.songs.slice(limit * page);

for(let song of album.songs) {
songs.unshift(song);
songs.pop();
}
}

最佳答案

这无法使用普通的.find().sort()来完成。相反,您需要使用 MongoDB 聚合管道 (.aggregate())。具体来说,您需要执行以下操作:

  1. 执行 $projection,如果 _id 是数组中的 $in,则您的新 sort_field被赋予值1,否则被赋予值0
  2. 执行 $sort,以便对新的 sort_field 进行降序排序。

如果您使用的是 MongoDB 3.4 或更高版本,那么由于 $addFields 运算符,这很容易:

const your_array_of_ids = [
ObjectId('objectid1'),
ObjectId('objectid2'),
ObjectId('objectid3')
];

SomeModel.aggregate([
{ '$addFields': {
'sort_field': { '$cond': {
'if': { '$in': [ '$_id', your_array_of_ids ] },
'then': 1,
'else': 0
}}
}},
{ '$sort': {
'sort_field': -1
}}
]);

如果您使用的是旧版本的 MongoDB,则解决方案类似,但您将使用 $project 而不是 $addFields。此外,您需要明确包含您想要包含的所有其他字段,否则它们将从结果中排除。

关于javascript - Mongodb 按数组排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53638144/

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