【问题标题】:Mongoose aggregation $match distinct based on another field?Mongoose 聚合 $match 基于另一个字段不同?
【发布时间】:2015-01-11 13:45:30
【问题描述】:

我有一个这样的收藏:

[
  {
    "ticketNumber" : "00001",
    "version" : "0"
  },
  {
    "ticketNumber" : "00001",
    "version" : "1"
  },
  {
    "ticketNumber" : "00001",
    "version" : "2"
  },
  {
    "ticketNumber" : "00002",
    "version" : "0"
  },
  {
    "ticketNumber" : "00003",
    "version" : "0"
  },
  {
    "ticketNumber" : "00003",
    "version" : "1"
  }
]

该模型具有其他属性,我将在以后的聚合管道中使用这些属性。我首先需要以某种方式进行过滤,以便它根据不同的票号和最新版本返回票:

[
  {
    "ticketNumber" : "00001",
    "version" : "2"
  },
  {
    "ticketNumber" : "00002",
    "version" : "0"
  },
  {
    "ticketNumber" : "00003",
    "version" : "1"
  }
]

不确定这是否可行?

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:

    您可以使用aggregation framework 执行此操作。这是一个简单的$group 操作,在您的“版本”上使用$max 运算符:

    db.collection.aggregate([
        { "$group": {
            "_id": "$ticketNumber",
            "version":  { "$max": "$version" }
    ])
    

    如果“版本”不是字符串会更好,但它仍然有效,因为即使作为数字字符串它仍然是词法。但是“10”在词法上并不大于“2”。所以要小心。

    【讨论】:

    • 谢谢,按照您的建议使用 $max 让它工作。必须在 $group 之前的版本中包含 $sort,并在 $group 中包含 $first 以恢复票证的其他属性。来自传统 SQL 的我很难理解它!
    • @PixelSheep 好吧,这里确实是一个问题一个答案的概念,但这里是 2c 版本。将聚合“管道”视为 unix 管道“|”操作数。从一端出来并通过“管道”送入的所有东西都进入下一个端。 “管道数组”中的每个“阶段”都是一个数组成员。但是在这里执行$sort 操作并使用$first 会过度,因为您只需要一个单数字段。对值进行排序并使用像$first 这样的分组运算符通常保留用于在“行/文档”中提取多个属性。 $min/$max 在这里更理想。
    • 感谢您的补充。原始模型实际上要大得多,并且包含子文档,例如'ticket' 上的 'assignments' 属性包含一组子文档。我实际上在同一个 $group 下使用 $max:assignments 进行了测试,它似乎工作正常,但我不确定这是否会保持一致,因为 mongoose 将如何知道要查找什么来确定分配数组是否是“最大”/最新版本吗?这就是为什么我认为在选择第一组分配之前我会使用 $sort (实际上,在这种情况下,'version' 也可以替换为使用 $first)。
    猜你喜欢
    • 2019-01-30
    • 2021-07-21
    • 1970-01-01
    • 2016-07-11
    相关资源
    最近更新 更多