Javascript 是否可以在集合中找到没有相同字段的随机文档?(monogdb\node.js)
例如,我有一个具有以下结构的集合Javascript 是否可以在集合中找到没有相同字段的随机文档?(monogdb\node.js),javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,例如,我有一个具有以下结构的集合users: { _id: 1, name: "John", from: "Amsterdam" }, { _id: 2, name: "John", from: "Boston" }, { _id: 3, name: "Mia", from: "Paris" }, { _id: 4, name: "Kate", from: "London" }, { _id: 5
users
:
{
_id: 1,
name: "John",
from: "Amsterdam"
},
{
_id: 2,
name: "John",
from: "Boston"
},
{
_id: 3,
name: "Mia",
from: "Paris"
},
{
_id: 4,
name: "Kate",
from: "London"
},
{
_id: 5,
name: "Kate",
from: "Moscow"
}
我怎样才能得到3个名字不会重复的随机文件
使用函数getFourNumbers(1,5)
,我得到一个包含3个非重复数字的数组,并按id进行搜索
var random_nums = getThreeNumbersnumbers(1, 5); // [2,3,1]
users.find({_id: {$in: random_nums}, function (err, data) {...} //[John, Mia, John]
但它可以由两个约翰或两个凯特组成,什么是不想要的行为。如何通过1次或最多2次查询获取三个随机文档(
[John,Mia,Kate]
。而不是[John,Kate,Kate]
或[John,Mia,John]
)?凯特或约翰(重复的名字)应该是随机的,但不应该重复。我想你要找的是$group
聚合器,它将为你提供收藏的独特价值。它可以用作:
db.users.aggregate( [ { $group : { name : "$name" } } ] );
MongoDB文档:我认为您正在寻找的是
$group
聚合器,它将为您提供集合的独特价值。它可以用作:
db.users.aggregate( [ { $group : { name : "$name" } } ] );
MongoDB文档:就在这里-请参阅代码中的注释,以进一步了解阶段的作用:
users.aggregate(
[
{ // eliminate duplicates based on "name" field and keep track of first document of each group
$group: {
"_id": "$name",
"doc": { $first: "$$ROOT" }
}
},
{
// restore the original document structure
$replaceRoot: {
newRoot: "$doc"
}
},
{
// select 3 random documents from the result
$sample: {
size:3
}
}
])
与往常一样,使用聚合框架,您可以通过添加或多或少的阶段来运行查询,以便一步一步地查看转换。现在开始-请参阅代码中的注释,以进一步了解阶段的作用:
users.aggregate(
[
{ // eliminate duplicates based on "name" field and keep track of first document of each group
$group: {
"_id": "$name",
"doc": { $first: "$$ROOT" }
}
},
{
// restore the original document structure
$replaceRoot: {
newRoot: "$doc"
}
},
{
// select 3 random documents from the result
$sample: {
size:3
}
}
])
与Agrgation框架一样,您可以在运行查询时添加或多或少的阶段,以便逐步查看转换