返回$sample结果作为附加的JSON密钥MongoDB

rsaldnfx  于 2022-12-26  发布在  Go
关注(0)|答案(2)|浏览(89)

我在MongoDB中执行了一个查询,通过ID查找一个特定的记录,它运行良好,并返回了以下文档:

{
   key1: "value1",
   key2: "value2"
}

现在我需要向返回的JSON记录添加键“seeAlso”。
此键将包含同一集合中其他3个记录的样本。
最终文档应如下所示:

{
   key1: "value1",
   key2: "value2",
   seeAlso: [
      {doc1},
      {doc2},
      {doc3},
   ]
}

$sample我已经知道怎么做了。必须将以下内容添加到管道中:

{
    '$sample': {
      'size': 10
    }
  }

我不知道的是如何将这个示例的结果存储在“seeAlso”键中。此时需要创建这样的键,它还不存在。

7z5jn7bk

7z5jn7bk1#

您可能只需要在子管道中执行$sample。要省略原始记录,请在子管道的开头添加一个$match,以便省略_id

db.collection.aggregate([
  {
    "$match": {
      key1: "value1"
    }
  },
  {
    "$lookup": {
      "from": "collection",
      "let": {
        id: "$_id"
      },
      "pipeline": [
        {
          $match: {
            $expr: {
              $ne: [
                "$_id",
                "$$id"
              ]
            }
          }
        },
        {
          "$sample": {
            "size": 3
          }
        }
      ],
      "as": "seeAlso"
    }
  }
])

Mongo Playground

ngynwnxp

ngynwnxp2#

您可以使用带有stages的$facet来执行此操作:

  • $具有2个管道的方面:

pipeline 1:$匹配单个文档
管线2:

  • $sample选择所需的文档数加1
  • $match用于排除管道1中选定的文档(以防万一)
  • $limit返回所需的文档数
  • $展开管道1
  • $project将pipeline 2添加到文档pipeline 1中的字段
  • $replaceRoot以使pipeline 1成为顶级文档

相关问题