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