是否有可能在集合中找到随机文档,没有相同的字段? (monogdb \的node.js)

时间:2017-08-21 17:04:17

标签: 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,
    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]

但它可能包括两个约翰或两个凯特,这是多么不受欢迎的行为。如何获得三个随机文档([John, Mia, Kate]。不是[John, Kate, Kate][John, Mia, John]),包含1个或最多2个查询?凯特或约翰(重复的名字)应该是随机的,但不应重复。

2 个答案:

答案 0 :(得分:1)

我认为您正在寻找的是 self.automaticallyAdjustsScrollViewInsets = False 聚合器,它将为您提供该集合的独特价值。它可以用作:

$group

MongoDB文档: Retrieve Distinct Values

答案 1 :(得分:1)

你去了 - 看看代码中的注释,以进一步解释这些阶段的作用:

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
        }
    }
])

与aggrgation框架一样,您可以运行添加了更多或更少阶段的查询,以便逐步查看转换。