如何在 MongoDB 中获取字段起始字母(A 到 Z)的随机文档?

How can I get random documents with the field starting letters (A to Z) in MongoDB?

我正在尝试使用 mongodb 进行聚合。我的目标是我想获得随机名称 以字母 A 到 Z 开头。因此,每个以字母开头的单词在响应中只能出现一次,但我不知道该怎么做。我使用 match 条件 with regexsample 条件来获取随机文档。

这是我的 collection;

[
  {
    "name": "ahmet"
  },
  {
    "name": "barış"
  },
  {
    "name": "ceyhun"
  },
  {
    "name": "aslan"
  },
  {
    "name": "deniz"
  },
  ....
]

这是我的聚合函数;

db.collection.aggregate([
  {
    $match: {
      name: {
        $regex: "^a|^b|^c" // must be A to Z
      }
    }
  },
  {
    "$sample": {
      "size": 3 // Must be 26
    }
  }
])

我正在等待这样的回复;

[
  {
    "name": "ahmet"
  },
  {
    "name": "barış"
  },
  {
    "name": "ceyhun"
  },
  .... // other words starting with d, e , f but only one word for each letter
]

但我得到了;

[
  {
    "_id": ObjectId("5a934e000102030405000001"),
    "name": "barış"
  },
  {
    "_id": ObjectId("5a934e000102030405000003"),
    "name": "aslan"
  },
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "name": "ahmet"
  },
  // name => aslan, name => ahmet (Two words starting with same letter)
]

我是 mongodb 的新手,如果有人能帮助我解决我的错误,我将不胜感激。

Mongo Playground

你可以这样做:

编辑 并提供警卫改进建议*(使用 $substrCP$ifNull):

db.collection.aggregate([
  {
    $group: {
      _id: {$substrCP: ["$name", 0, 1]},
      name: {$push: "$name"}
    }
  },
  {
    $project: {_id: 0,
      name: {
        $arrayElemAt: [
            "$name", 
            {$toInt: {$multiply: [{$rand: {}}, {$size: {$ifNull: ["$name",[]] }}]}
          }
        ]
      }
    }
  }
])

正如您在 this playground example 上看到的那样。

$group 将为每个 firstL 保留一个名称列表,$arryElemAt$rand 将仅保留一个随机项目。

*感谢@Mbay 和@Paul 的改进建议