Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Mongodb按数组排序_Javascript_Node.js_Mongodb_Mongoose_Nosql - Fatal编程技术网

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
    ,这样您就可以对新的
    排序字段进行降序排序了
  • 如果您使用的是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
    。此外,您还需要明确包含所有其他要包含的字段,否则这些字段将被排除在结果之外。

    请您再解释一下。item包含什么?items是一个_id的数组。您可以扩展一下“按给定数组排序”的含义吗?请更清楚、更详细地说明文档的外观以及您希望看到的结果行为。您在这里提供的内容没有太多可供参考。@B.Fleming,Anthony Winzlet我更新了问题以使其更清楚。您可以使用
    $indexOfArray
    。类似于
    db.collection.aggregate([{“$addFields”:{“order”:{“$indexOfArray”:[arrayOfIds,$\u id”]}}}},{“$sort”:{“order”:1}}])