在排序集合中查找彼此距离内的 2 个文档

Find 2 documents within distance to each other in sorted collection

我的目标是找到两个随机文件。每个文件都有一个评级。这两个文档之间的评级差异对我来说并不重要。但重要的是这两个文档之间的“文档距离”。

以这份榜单为例。假设聚合随机选择 Person7。现在我想要一个随机文档说最多 3 个文档远离 Person7。所以在这种情况下,它应该是 Person4, 5, 6, 8, 9, 10.

    [
     { name: "Person1", rating: 50 },
     { name: "Person2", rating: 55 },
     { name: "Person3", rating: 60 },
     { name: "Person4", rating: 65 },
     { name: "Person5", rating: 70 },
     { name: "Person6", rating: 75 },
     { name: "Person7", rating: 800 },
     { name: "Person8", rating: 850 },
     { name: "Person9", rating: 900 },
     { name: "Person10", rating: 100000 },
     { name: "Person11", rating: 100001 },
     { name: "Person12", rating: 102000 }
    ]

最后,我想将这些随机选择的文档作为管道的结果。因此,例如“Person2”和“Person5”或“Person8”和“Person11”,但不是“Person1”和“Person5”,因为它们之间的距离超过 3.

我想我必须聚合此列表,但我不确定 运行 的聚合类型。我也不确定一次聚合是否足够。我可能需要在多个步骤中(在交易中)将其分为两个。

从MongoDBv5.0+开始,您可以使用$setWindowFields获取附近的文档。然后,您可以使用 $sample 随机获得一个文档。

db.collection.aggregate([
  {
    "$setWindowFields": {
      "partitionBy": null,
      "sortBy": {
        "rating": 1
      },
      "output": {
        nearDocs: {
          $addToSet: "$_id",
          window: {
            documents: [
              -3,
              3
            ]
          }
        }
      }
    }
  },
  {
    "$sample": {
      "size": 1
    }
  },
  {
    "$lookup": {
      "from": "collection",
      "localField": "nearDocs",
      "foreignField": "_id",
      "as": "nearDocs"
    }
  },
  {
    "$unwind": "$nearDocs"
  },
  {
    $match: {
      $expr: {
        $ne: [
          "$_id",
          "$nearDocs._id"
        ]
      }
    }
  },
  {
    "$sample": {
      "size": 1
    }
  },
  {
    "$project": {
      matchPairs: [
        {
          _id: "_id",
          name: "$name",
          rating: "$rating"
        },
        "$nearDocs"
      ]
    }
  },
  {
    "$unwind": "$matchPairs"
  },
  {
    "$replaceRoot": {
      "newRoot": "$matchPairs"
    }
  }
])

这里是Mongo Playground供大家参考。