Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 猫鼬&x2014;使用聚合使用$sum创建新属性_Javascript_Node.js_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

Javascript 猫鼬&x2014;使用聚合使用$sum创建新属性

Javascript 猫鼬&x2014;使用聚合使用$sum创建新属性,javascript,node.js,mongodb,mongodb-query,aggregation-framework,Javascript,Node.js,Mongodb,Mongodb Query,Aggregation Framework,我试图在所有包含数字数组和的文档中添加一个新字段 以下是模式(为了简洁起见,删除了不相关的字段): 我建立模型: PollModel = mongoose.model('Poll', PollSchema); 我使用聚合创建一个新字段,其中包含投票数数组的总和 PollModel.aggregate([ { $project: { totalVotes: { $sum: "$votes"} } } ]); 当我启动我的服务器时,我没有收到任何错误;但是,totalvows

我试图在所有包含数字数组和的文档中添加一个新字段

以下是模式(为了简洁起见,删除了不相关的字段):

我建立模型:

PollModel = mongoose.model('Poll', PollSchema);
我使用聚合创建一个新字段,其中包含投票数数组的总和

PollModel.aggregate([
 {
  $project: {
    totalVotes: { $sum: "$votes"}
  }
 }
]);

当我启动我的服务器时,我没有收到任何错误;但是,
totalvows
字段尚未创建。我使用文档来帮助我。它同样使用了
$sum
操作符,我完全按照文档中的说明进行了操作,但没有结果。

您的模式中没有
totalvowers
。请尝试下面的代码

var PollSchema = new Schema(
  {
    votes: [Number],
    totalVotes: Number
  }
 );

PollModel.aggregate([
 {
  $project: {
    totalVotes: { $sum: "$votes"}
  }
 }
]);


您的架构中没有
totalvots
。请尝试下面的代码

var PollSchema = new Schema(
  {
    votes: [Number],
    totalVotes: Number
  }
 );

PollModel.aggregate([
 {
  $project: {
    totalVotes: { $sum: "$votes"}
  }
 }
]);


不幸的是,这并不像您想象的那样有效,因为“投票”实际上是一个值数组,首先是一个值数组,其次是一个仅用于管道阶段的值数组

因此,为了将数组的总数作为另一个属性获取,首先必须将数组和
$group
一起放在文档键上,才能
$sum
元素总数:

PostModel.aggregate(
[
{“$unwind”:“$VOUTES”},
{“$组”:{
“\u id”:“$\u id”,
“anotherField”:{“$first”:“$anotherField”},
“总票数”:{“$sum”:“$VOUTES”}
}}
],
功能(错误、结果){
}
);
这里还要注意,
$first
中的另一个累加器对于结果中需要的每个附加字段都是必需的,因为
$group
$project
只返回您要求的字段

一般来说,由于性能原因,最好将其作为属性保存在每个文档中,因为它比使用聚合更快。因此,要做到这一点,只需在每次添加到数组时使用以下方法增加总数:

PostModel.update(
{u id:id},
{
“$push”:{“投票”:5},
“$inc”:{“总票数”:5}
},
功能(错误,未受影响){
}
);

这样,“totalVotes”字段就可以随时使用,而无需解构数组并对每个文档的值求和。不幸的是,这并不像您想象的那样有效,因为“votes”实际上是一个值数组,其次,因为是一个仅用于管道阶段的

因此,为了将数组的总数作为另一个属性获取,首先必须将数组和
$group
一起放在文档键上,才能
$sum
元素总数:

PostModel.aggregate(
[
{“$unwind”:“$VOUTES”},
{“$组”:{
“\u id”:“$\u id”,
“anotherField”:{“$first”:“$anotherField”},
“总票数”:{“$sum”:“$VOUTES”}
}}
],
功能(错误、结果){
}
);
这里还要注意,
$first
中的另一个累加器对于结果中需要的每个附加字段都是必需的,因为
$group
$project
只返回您要求的字段

一般来说,由于性能原因,最好将其作为属性保存在每个文档中,因为它比使用聚合更快。因此,要做到这一点,只需在每次添加到数组时使用以下方法增加总数:

PostModel.update(
{u id:id},
{
“$push”:{“投票”:5},
“$inc”:{“总票数”:5}
},
功能(错误,未受影响){
}
);

这样,“totalVotes”字段就可以随时使用,而无需解构数组并对每个文档的值求和。MongoDb聚合不会将其结果保存到数据库中。您只需在回调中得到内联聚合的结果。 因此,聚合后,您需要对数据库进行多次更新:

PollModel.aggregate([
{
    $project: { totalVotes: { $sum: "$votes"} }
}]).exec( function(err, docs){
        // bulk is used for updating all records within a single query
        var bulk = PollModel.collection.initializeUnorderedBulkOp();

        // add all update operations to bulk
        docs.forEach(function(doc){
            bulk.find({_id: doc._id}).update({$set: {totalVotes: doc.totalVotes}});
        });

        // execute all bulk operations
        bulk.execute(function(err) {
        });
    })
});

MongoDb聚合不会将其结果保存到数据库中。您只需在回调中得到内联聚合的结果。 因此,聚合后,您需要对数据库进行多次更新:

PollModel.aggregate([
{
    $project: { totalVotes: { $sum: "$votes"} }
}]).exec( function(err, docs){
        // bulk is used for updating all records within a single query
        var bulk = PollModel.collection.initializeUnorderedBulkOp();

        // add all update operations to bulk
        docs.forEach(function(doc){
            bulk.find({_id: doc._id}).update({$set: {totalVotes: doc.totalVotes}});
        });

        // execute all bulk operations
        bulk.execute(function(err) {
        });
    })
});

@Blakes Seven和@Volodymyr Synytskyi帮我找到了解决方案!我还发现文档特别有用

PollModel.aggregate(
[
    { '$unwind': '$votes' },
    { '$group': {
        '_id': '$_id',
        'totalVotes': { '$sum': '$votes' }
    }}
],
function(err,results) {
    // console.log(results);
    results.forEach(function(result){
        var conditions = { _id: result._id }, 
            update = { totalVotes: result.totalVotes }, 
            options = { multi: true };

        PollModel.update(conditions, update, options, callback);

        function callback (err, numAffected) {
            if(err) {
                console.error(err);
                return;
            } else {
                // console.log(numAffected);
            }
        }
    });
}
);

@Blakes Seven和@Volodymyr Synytskyi帮我找到了解决方案!我还发现文档特别有用

PollModel.aggregate(
[
    { '$unwind': '$votes' },
    { '$group': {
        '_id': '$_id',
        'totalVotes': { '$sum': '$votes' }
    }}
],
function(err,results) {
    // console.log(results);
    results.forEach(function(result){
        var conditions = { _id: result._id }, 
            update = { totalVotes: result.totalVotes }, 
            options = { multi: true };

        PollModel.update(conditions, update, options, callback);

        function callback (err, numAffected) {
            if(err) {
                console.error(err);
                return;
            } else {
                // console.log(numAffected);
            }
        }
    });
}
);

@毗湿奴我已经定义了模式?你不能得到模型中没有定义的字段。这就是问题所在。@Vishnu聚合框架的结果与模型上的模式并不矛盾,但可以是任何内容。所以这不是问题所在,而是您不能在
$project
中应用
$sum
,也不能直接在数组中应用。@Vishnu我已经定义了模式?您无法获取未在模型中定义的字段。这就是问题所在。@Vishnu聚合框架的结果与模型上的模式并不矛盾,但可以是任何内容。所以这不是问题所在,而是您不能在
$project
中应用
$sum
,也不能直接在数组上应用。我尝试了,字段显示在文档中,但值只是一个空值array@Matthew只需尝试更新的代码
totalVotes
应该是一个数字,而不是一个数组:P.I尝试了它,该字段显示在文档中,但该值只是一个空值array@Matthew只需尝试更新的代码
totalvots
应该是一个数字,而不是一个数组:P.我认为这不起作用,因为我在使用Mongoose。我认为这不起作用,因为我在使用Mongoose