【问题标题】:Using mongoose to get the distinct values of an object in array for all documents使用 mongoose 获取所有文档的数组中对象的不同值
【发布时间】:2016-10-05 06:03:36
【问题描述】:

我在 nodejs 中使用 Mongoose。所以这里是一个示例 Publisher 模型:

name: String,
books: [{
    title: String,
    author: {
        name: String,
        age: Number
    }
}]

我想获取与正则表达式匹配的所有不同作者姓名。我是 noSql 的新手,所以也许我只是在做一些愚蠢的事情。我想我想做这样的事情:

Publisher.aggregate([
    {$unwind: '$books'},
    {$match: {
        'books.author.name': new RegExp(req.params.regex)
    }},
    {$group: {
        _id: '$books.author.name'
    }},
    {$group: {
        distinctValues: {$addToSet: '$_id'}
    }}
], function(err, result) {
    if(err) throw err;
    res.json(result);
})

这似乎应该根据:https://dba.stackexchange.com/questions/59661/mongodb-distinct-in-an-array

非常感谢你们为我提供帮助的任何和所有输入。

【问题讨论】:

    标签: node.js mongoose aggregate distinct


    【解决方案1】:

    您没有提供执行此查询时遇到的错误,但您似乎得到了类似的信息:“组规范必须包含 _id”。 您的查询的问题在这里:

    {$group: {
        distinctValues: {$addToSet: '$_id'}
    }}
    

    $group 运算符必须包含一个 _id 字段

    到目前为止,$group 运算符已经提供了不同的组,最后一个管道似乎是多余的,下一个对我有用:

    Publisher.aggregate([
        {$unwind: '$books'},
        {$match: {
            'books.author.name': new RegExp(req.params.regex)
        }},
        {$group: {
            _id: '$books.author.name'
        }}
    ], function(err, result) {
        if(err) throw err;
        res.json(result);
    })
    

    【讨论】:

    • 那行得通。谢谢。不过我很困惑。返回的值似乎不同,但您的更改并未指定任何唯一性要求。这是为什么呢?
    • 这就是 $group 运算符的工作方式,您可以查看文档,那里有一般示例 (docs.mongodb.com/manual/reference/operator/aggregation/group)。来自文档:“按某些指定的表达式对文档进行分组,并将每个不同分组的文档输出到下一阶段”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 2016-01-23
    • 2021-12-03
    相关资源
    最近更新 更多