【问题标题】:MongoDB find $in sorting issueMongoDB 发现 $in 排序问题
【发布时间】: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
  }
})

【问题讨论】:

    标签: node.js arrays mongodb express mongoose


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 2019-04-13
      • 2013-09-09
      • 1970-01-01
      • 2021-09-08
      相关资源
      最近更新 更多