首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获取所有文档,在相同的情况下(相似)-后面的文档

获取所有文档,在相同的情况下(相似)-后面的文档
EN

Stack Overflow用户
提问于 2021-10-05 07:28:59
回答 2查看 50关注 0票数 0

有一个体育解析器。它在一个圆圈里工作。根据某些逻辑,体育赛事被添加到数据库中。在每个解析周期中,可以将体育事件添加到数据库中,但不能添加)

我需要得到最后两个解析周期的所有体育赛事。但是,如果两个周期都有体育赛事,那么只能从最后一个周期开始。这就是问题所在。样本文件:

代码语言:javascript
运行
复制
 {
    "command1": "A",
    "command2": "B",
    "parseCount": 0
  },
  {
    "command1": "A",
    "command2": "B",
    "parseCount": 1
  },
  {
    "command1": "A",
    "command2": "B",
    "parseCount": 2
  },
  {
    "command1": "C",
    "command2": "D",
    "parseCount": 1
  },
  {
    "command1": "E",
    "command2": "F",
    "parseCount": 2
  },

因此,我应该从上面的列表中得到最后3份文件。该文档还包含字段:匹配时间和ObjectId

https://mongoplayground.net/p/-9gz4zOnudW

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-05 09:00:44

如果我的理解是正确的,那么首先可以使用$sort,然后将$first对象放入$group,如下所示:

我使用过$first: $$ROOT,但如果需要,可以对对象中的每个值使用$first: value

此查询:

  • 首先由parseCount进行排序,以获得第一位置的较高值。
  • 然后通过两个条件进行$group,得到第一个对象(按顺序排列)
  • 并使用$project获取所需的输出值。
代码语言:javascript
运行
复制
db.collection.aggregate([
  {
    "$sort": {
      "parseCount": -1
    }
  },
  {
    "$group": {
      "_id": {
        "command1": "$command1",
        "command2": "$command2"
      },
      "object": {
        "$first": "$$ROOT"
      }
    }
  },
  {
    "$project": {
      "_id": "$object._id",
      "command1": "$object.command1",
      "command2": "$object.command2",
      "parseCount": "$object.parseCount"
    }
  }
])

示例这里

票数 1
EN

Stack Overflow用户

发布于 2021-10-05 09:27:56

查询

  • 它类似于2个查询,但可以通过查找变成1。
  • 可以使用facet并做2组,但在收集中限制在最大16 be数据,下面的解决方案没有这个限制。
  • 使用查找找到集合的最大解析(mongodb自动优化它,因此查找中的管道将只对每个集合文档运行一次,至少在我过去测试它时发生了这种情况)
  • 我们只保留最后两个分析,例如,如果max=3保留parseCount=3parseCount=2,我们也只保留parseCount>0,在游乐场上有过滤器,如果不需要它,就移除它。
  • command1,command2组成,只保留最大parseCount,您说过,我们只保留最新的,如果我们有超过1
  • 项目来恢复文档结构,matchTime_id也是保留的,因为您说您也有

这里的测试代码

代码语言:javascript
运行
复制
db.collection.aggregate([
  {
    "$lookup": {
      "from": "collection",
      "pipeline": [
        {
          "$group": {
            "_id": null,
            "maxParse": {
              "$max": "$parseCount"
            }
          }
        }
      ],
      "as": "result"
    }
  },
  {
    "$set": {
      "maxParses": {
        "$let": {
          "vars": {
            "v0": {
              "$arrayElemAt": [
                "$result",
                0
              ]
            }
          },
          "in": "$$v0.maxParse"
        }
      }
    }
  },
  {
    "$unset": [
      "result"
    ]
  },
  {
    "$match": {
      "$expr": {
        "$and": [
          {
            "$gt": [
              "$parseCount",
              0
            ]
          },
          {
            "$gte": [
              "$parseCount",
              {
                "$subtract": [
                  "$maxParses",
                  1
                ]
              }
            ]
          }
        ]
      }
    }
  },
  {
    "$group": {
      "_id": {
        "command1": "$command1",
        "command2": "$command2"
      },
      "maxParseCount": {
        "$max": {
          "parseCount": "$parseCount",
          "matchTime": "$matchTime",
          "id": "$_id"
        }
      }
    }
  },
  {
    "$replaceRoot": {
      "newRoot": {
        "$mergeObjects": [
          "$_id",
          "$maxParseCount",
          "$$ROOT"
        ]
      }
    }
  },
  {
    "$project": {
      "command1": 1,
      "command2": 1,
      "parseCount": 1,
      "matchTime": 1,
      "_id": "$id"
    }
  }
])

解释根据您的数据进行的查询

  • 将找到maxParse=2 (查找可以做到这一点)
  • 第一个文档将被过滤掉,因为只有2,1个解析被保留,并且它有0。
  • 剩下的一个将按command1分组,command2 "A","B“有2个文档(_id=2,_id=3),但是只有_id=3会通过,因为它有最大的parseCount
代码语言:javascript
运行
复制
[
  {
    "_id": 1,
    "command1": "A",
    "command2": "B",
    "parseCount": 0,
    "matchTime": 1
  },
  {
    "_id": 2,
    "command1": "A",
    "command2": "B",
    "parseCount": 1,
    "matchTime": 2
  },
  {
    "_id": 3,
    "command1": "A",
    "command2": "B",
    "parseCount": 2,
    "matchTime": 3
  },
  {
    "_id": 4,
    "command1": "C",
    "command2": "D",
    "parseCount": 1,
    "matchTime": 4
  },
  {
    "_id": 5,
    "command1": "E",
    "command2": "F",
    "parseCount": 2,
    "matchTime": 5
  }
]

结果

代码语言:javascript
运行
复制
[
  {
    "_id": 3,
    "command1": "A",
    "command2": "B",
    "matchTime": 3,
    "parseCount": 2
  },
  {
    "_id": 4,
    "command1": "C",
    "command2": "D",
    "matchTime": 4,
    "parseCount": 1
  },
  {
    "_id": 5,
    "command1": "E",
    "command2": "F",
    "matchTime": 5,
    "parseCount": 2
  }
]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69446397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档