【问题标题】:Add sequence number to items from mongodb query将序列号添加到来自 mongodb 查询的项目
【发布时间】:2020-11-28 14:17:30
【问题描述】:

我有 MongoDB 集合 items 和以下文档:

{ "name": "First", "value": 8 },
{ "name": "Second", "value": 2 },
{ "name": "Third", "value": 5 }

我想按namevalue 对它们进行排序,然后为它们中的每一个添加序列号(index 属性)(第一项将具有"index": 1,第二项将具有"index": 2,等等)。所以对于这个查询:

db.items.aggregate([{ $sort: { "value": 1 } }])

结果应该是:

{ "name": "Second", "value": 2, "index": 1 },
{ "name": "Third", "value": 5, "index": 2 },
{ "name": "First", "value": 8, "index": 3 }

这也适用于$skip。使用{ "$skip": 1 },结果应该是索引为2, 3 的项目,而不是1, 2。有没有什么方法可以使用纯 MongoDB 来做到这一点,而不需要任何应用程序逻辑?

【问题讨论】:

  • 您的问题是跳过排序输出还是在排序结果中添加数字?
  • @Gibbs 添加一个数字来排序结果。

标签: mongodb sorting


【解决方案1】:

这可能是您可以在$unwind 中使用includeArrayIndex 的一种选择,

  • $sort 按你已经做过的值
  • $group namevalue 并推入 items
  • $unwind 解构 items 并在 includeArrayIndex 中设置字段 index
  • $project 必填字段和增量索引,因为它以 0 零开头
db.collection.aggregate([
  { $sort: { value: 1 } },
  {
    $group: {
      _id: 1,
      items: {
        $push: {
          name: "$name",
          value: "$value"
        }
      }
    }
  },
  {
    $unwind: {
      path: "$items",
      includeArrayIndex: "index"
    }
  },
  {
    $project: {
      _id: 0,
      name: "$items.name",
      value: "$items.value",
      index: { $add ["$index", 1] }
    }
  }
])

游乐场:https://mongoplayground.net/p/572ReIpRcl6

【讨论】:

    【解决方案2】:

    注意:受@turvishal 的回答启发,满足以下几点

    1. 索引从 1 开始
    2. 跳过 OP 想要的方式

    Mongo-play

    db.collection.aggregate([
      {
        $sort: {
          value: 1
        }
      },
      {
        $group: {
          _id: 1,
          items: {
            $push: {
              name: "$name",
              value: "$value"
            }
          }
        }
      },
      {
        $unwind: {
          path: "$items",
          includeArrayIndex: "index"
        }
      },
      {
        $project: {
          _id: 0,
          name: "$items.name",
          value: "$items.value",
          index: { //Incrementing the index by 1
            $add: [
              "$index",
              1
            ]
          }
        }
      },
      { //Addition of skip 
        "$skip": 1
      }
    ])
    

    【讨论】:

    • 感谢解答,我真的忘记加$add操作了,谢谢。
    • 是的,我希望 OP 接受您的回答,因为您确实解决了主要问题。我做了我能做的(+1) :) :) 继续摇摆
    • 没关系,我不介意,OP应该对解决方案感到满意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 2022-10-12
    • 1970-01-01
    • 2021-09-20
    • 2018-09-07
    相关资源
    最近更新 更多