此mongoskin聚合命令有什么问题?

jeebface

我有一个mongodb / mongoskin聚合请求,如下所示:

db.collection(customerTable + '_earnedinfluencers').aggregate([
    {
        $group: {
            _id: '$user',
            name: '', // to be filled separately
            username: '', // to be filled separately 
            picture: '', // to be filled separately
            city: '', // to be filled separately
            kids: { $sum: '$kids' },
            revenue: { $sum: '$dayIncome' },
            kidsRevRatio: { $divide: [ { $sum: '$kids' }, { $sum: '$dayIncome' } ] }
        }, 

        $match: {
            richness: { $gte: variable1 },
            kids: { $lt: variable2 },
            hobbies: { $in: ['hobby1', 'hobby2', 'hobby3', 'hobby4'] },
            event: { $in: schoolfestival },
            event: { $ne: 0 }
        },

        $project: {
            _id: 0,
            user: '$_id',
            name: 1,
            username: 1,
            picture: 1,
            city: 1,
            kids: 1,
            revenue: 1,
            kidsRevRatio: 1
        }
    }
], function(err, result) {
    // do something with err and result
});

上面的代码给出以下错误:

Error: {"name":"MongoError","errmsg":"exception: A pipeline stage specification object must contain exactly one field.","code":16435,"ok":0}

我一般是mongo和db的新手,无法分辨我做错了什么。

尼尔·伦恩

您的管道参数不平衡,每个阶段都是一个单独的文档,因此您需要包装每个文件。但是还有其他一些问题

db.collection(customerTable + '_earnedinfluencers').aggregate([

    { $match: {
            richness: { $gte: variable1 },
            kids: { $lt: variable2 },
            hobbies: { $in: ['hobby1', 'hobby2', 'hobby3', 'hobby4'] },
            event: { $in: schoolfestival },
    }},

    { $group: {
            _id: '$user',
            name: { '$first': '$name' },
            username: { '$first': '$username' },
            picture: { '$first': '$picture' },
            city: { '$first': '$city' }
            kids: { '$sum': '$kids' },
            revenue: { '$sum': '$dayIncome' },
            kidsSum: { '$sum': '$kids' },
    }}, 


    { $project: {
            _id: 0,
            user: '$_id',
            name: 1,
            username: 1,
            picture: 1,
            city: 1,
            revenue: 1,
            kidsSum: 1,
            kidsRevRatio: { $divide: [ '$kidsSum', '$revenue' ] }
    }}
], function(err, result) {
    // do something with err and result
});

您将整个管道作为一个文档,实际上它需要一系列文档,如图所示。

但是,实际上您要$match首先筛选出结果。如果您确实要在组之后进行一些其他匹配,则可以在之后将其他匹配添加到管道中。

$group操作要求_id分组键之外的所有字段都需要一个“分组运算符”,除非它们是_id您所在的分组的一部分,否则您不能仅仅将它们自己取回通常,您需要一个运算符,例如,$first或者完全省略它们。

仅顶级分组运算符,因此类似$divide操作不是分组运算符。为了在处理一个或多个$sum结果时执行此类操作,请$project使用具有计算值的字段将其移至稍后

此外,诸如项目和组之类的操作也会从管道中“删除”字段,并且仅保留您明确包括的字段。因此,您不能指定不存在的字段。这就是为什么$match首先使用索引以及可以使用索引的原因之一,而且只有在管道开始时才能这样做。

但是,对于每个阶段,唯一存在的领域就是所提到的领域。作为进一步的优化,“优化器”从一开始就将不包括文档中未特别提及的任何字段。因此,只有剩下的第一阶段比赛和小组比赛中引用的那些才会被包括在内,然后可能再次过滤掉。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章