Mongodb 从子文档嵌套数组中聚合 N 个随机项

Mongodb aggregation N random item from subdocument nested array

大家好,

我正在尝试 return 从聚合管道中的嵌套数组中提取一些 n 个随机项,但是,我似乎无法弄清楚。 mongodb 中关于 random 的所有文档都处于文档级别,$sample 将 return 一些基于定义的样本大小的文档。我想 return 从一个文档中的数组中获取 n 个随机数,然后在后续阶段执行 $lookup 阶段。下面的例子。

这是文档

{       
    _id: "61005f388308a717883ad3d2",
    ...................
    ...................
    "productLine": {
            "product": [
                    "5fefa2556308ab102854baf7",
                    "5fefa2556308ab102854baf8",
                    "5fefa2556308ab102854baf9",
                    "5fefa2556308ab102854bafc",
                    "5fefa2556308ab102854bag7",
                    "5fefa2556308ab102854bah8",
                    "5fefa2556308ab102854bac5",
                    "5fefa2556308ab102854babc"
            ],
            "created_count": 4,
            "purchased": [],
            "purchased_count": 0,
    },
    "following": {
            "users": [],
            "count": 0
    },
    "followers": {
            "users": [],
            "count": 0
    },
    "product_picture": "xxxxxxxxx",
    ....................
    ....................
    ....................
    
    "__v": 0
}

所以在本文档中,我在 productLine 中有 4 个产品 ID,我希望能够创建一个阶段 select 随机其中的 2 个,以便在接下来的阶段我可以执行 $查找这些 ID。所以基本上在舞台之后,文档看起来像这样。

{       
    _id: "61005f388308a717883ad3d2",
    ...................
    ...................
    "productLine": {
            "product": [
                    "5fefa2556308ab102854baf8", // this would be chosen at random
                    "5fefa2556308ab102854baf9", // this would be chosen at random
            ],
            "created_count": 4,
            "purchased": [],
            "purchased_count": 0,
    },
    "following": {
            "users": [],
            "count": 0
    },
    "followers": {
            "users": [],
            "count": 0
    },
    "product_picture": "xxxxxxxxx",
    ....................
    ....................
    ....................
    
    "__v": 0
}

想法是当用户 select 产品线时,它将 return 来自该产品线的两个随机产品。

任何帮助将不胜感激!!!

您可以在 $lookup 的子流水线中执行 $sample

{
    "$lookup": {
      "from": "product",
      "pipeline": [
        {
          "$project": {
            _id: 1
          }
        },
        {
          "$sample": {
            "size": 4
          }
        }
      ],
      "as": "productLookup"
    }
}

这里是Mongo playground供大家参考。