在排序集合中查找彼此距离内的 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供大家参考。
我的目标是找到两个随机文件。每个文件都有一个评级。这两个文档之间的评级差异对我来说并不重要。但重要的是这两个文档之间的“文档距离”。
以这份榜单为例。假设聚合随机选择 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供大家参考。