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框架一样,您可以在运行查询时添加或多或少的阶段,以便逐步查看转换