MongoDB 发现 $in 排序问题

Posted

技术标签:

【中文标题】MongoDB 发现 $in 排序问题【英文标题】:MongoDB find $in sorting issue 【发布时间】:2021-02-01 13:07:10 【问题描述】:

我需要从 ID 位于数组中的 MongoDB 集合中获取文档:

[
  '5f80a44d0179262f7c2e6a42',
  '5f8c00762fae890e9c4d029c',
  '5f802cf8abac1116a46bf9d4'
]

问题是,文档不是按我的阵列 ID 的顺序出现的。对于上述数组 ID,它们将出现 (1, 0, 2)。

如何按照我的 ID 数组顺序制作它们?我正在使用 NodeJs + Mongoose。

我的代码:

var ids = ['5f80a44d0179262f7c2e6a42','5f8c00762fae890e9c4d029c','5f802cf8abac1116a46bf9d4']

Product.find(
  _id: 
    $in: ids
  
)

【问题讨论】:

【参考方案1】:

我认为 find() 或 MongoDB 中与此相关的任何可用功能都不可能实现,

aggregate() 是可能的,但这只会满足您的预期结果,

我不建议使用它,因为这会影响查询响应的性能,这可能是一个繁重的事务。

$match你的条件 $group 通过 null 并在 root 中创建所有匹配对象的数组 $addFields 添加我们搜索的 ids 数组 $unwind解构ids数组,这将按照我们在ids数组中提供的顺序解构 $project, $reduce 作为根数组输入并检查条件,如果 id 匹配则返回对象 $replaceWith 将根对象替换为根
var ids = [
  ObjectId("5f802cf8abac1116a46bf9d4"), 
  ObjectId("5f8c00762fae890e9c4d029c"), 
  ObjectId("5f80a44d0179262f7c2e6a42")
];

Product.aggregate([
   $match:  _id:  $in: ids   ,
  
    $group: 
      _id: null,
      root:  $push: "$$ROOT" 
    
  ,
   $addFields:  ids: ids  ,
   $unwind: "$ids" ,
  
    $project: 
      root: 
        $reduce: 
          input: "$root",
          initialValue: ,
          in:  $cond: [ $eq: ["$$this._id", "$ids"] , "$$this", "$$value"] 
        
      
    
  ,
   $replaceWith: "$root" 
])

Playground

【讨论】:

以上是关于MongoDB 发现 $in 排序问题的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB 通过配置文件启动及注册服务

458 MongoDB安装

node - MongoDB数据库

???????????????????????? - ???????(IN MONGODB)

Ubuntu下,解决mongod服务无法启动的问题

mongod 命令执行发现已经有进程在运行mongod数据库--errno:48 Address already in use for socket: 0.0.0.0:27017