如何在 MongoDB 中获取字段起始字母(A 到 Z)的随机文档?
How can I get random documents with the field starting letters (A to Z) in MongoDB?
我正在尝试使用 mongodb 进行聚合。我的目标是我想获得随机名称
以字母 A 到 Z 开头。因此,每个以字母开头的单词在响应中只能出现一次,但我不知道该怎么做。我使用 match 条件 with regex 和 sample 条件来获取随机文档。
这是我的 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 的新手,如果有人能帮助我解决我的错误,我将不胜感激。
你可以这样做:
编辑 并提供警卫改进建议*(使用 $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 的改进建议
我正在尝试使用 mongodb 进行聚合。我的目标是我想获得随机名称 以字母 A 到 Z 开头。因此,每个以字母开头的单词在响应中只能出现一次,但我不知道该怎么做。我使用 match 条件 with regex 和 sample 条件来获取随机文档。
这是我的 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 的新手,如果有人能帮助我解决我的错误,我将不胜感激。
你可以这样做:
编辑 并提供警卫改进建议*(使用 $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 的改进建议