有没有一种方法可以对给定数组进行排序?
类似这样的东西:
const somes = await SomeModel.find({}).sort({'_id': {'$in': [ObjectId('sdasdsd), ObjectId('sdasdsd), ObjectId('sdasdsd)]}}).exec()
我正在寻找一种获得解决方案的方法,该方法可获取集合的所有文档并根据文档的_id与给定数组之一匹配的方式进行排序。
一个例子:
我们有专辑收藏和歌曲收藏。在专辑集合中,我们存储属于专辑的歌曲的ID。
我想获取歌曲,但如果歌曲在专辑中,则将其放在阵列的前面。
我按照以下步骤解决了这个问题,但是看起来有些不客气:
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();
}
}
答案 0 :(得分:1)
使用普通的.find().sort()
无法实现。相反,您将需要使用MongoDB聚合管道(.aggregate()
)。具体来说,您需要执行以下操作:
$project
离子,如果_id
是数组$in
,则新sort_field
的值是1
,否则它的值是值0
。$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的旧版本,则解决方案类似,但是将使用$addFields
代替$project
。另外,您将需要明确包括要包含的所有其他字段,否则它们将从结果中排除。