Javascript Mongodb按数组排序
是否有一种按给定数组排序的方法 大概是这样的:Javascript Mongodb按数组排序,javascript,node.js,mongodb,mongoose,nosql,Javascript,Node.js,Mongodb,Mongoose,Nosql,是否有一种按给定数组排序的方法 大概是这样的: const somes = await SomeModel.find({}).sort({'_id': {'$in': [ObjectId('sdasdsd), ObjectId('sdasdsd), ObjectId('sdasdsd)]}}).exec() 我所寻找的是一种获得解决方案的方法,即获取集合中的所有文档,并根据文档的_id是否与给定数组中的一个匹配进行排序 例如: 我们有专辑集和歌曲集。在唱片集中,我们存储属于唱片集的歌曲的ID
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();
}
}
这无法使用普通的
.find().sort()
来完成。相反,您需要使用MongoDB聚合管道(.aggregate()
)。具体而言,您需要执行以下操作:
$project
操作,如果\u id
是$in
数组中的,则新的排序字段将被赋予值1
,否则将被赋予值0
$sort
,这样您就可以对新的排序字段进行降序排序了
$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
。此外,您还需要明确包含所有其他要包含的字段,否则这些字段将被排除在结果之外。请您再解释一下。item包含什么?items是一个_id的数组。您可以扩展一下“按给定数组排序”的含义吗?请更清楚、更详细地说明文档的外观以及您希望看到的结果行为。您在这里提供的内容没有太多可供参考。@B.Fleming,Anthony Winzlet我更新了问题以使其更清楚。您可以使用$indexOfArray
。类似于db.collection.aggregate([{“$addFields”:{“order”:{“$indexOfArray”:[arrayOfIds,$\u id”]}}}},{“$sort”:{“order”:1}}])