Mongodb Mongoose:用$sum插入文档
假设我有一个如下所示的文档:Mongodb Mongoose:用$sum插入文档,mongodb,mongoose,Mongodb,Mongoose,假设我有一个如下所示的文档: var TestSchema = new Schema({ _id: String, userId: Number, date: Date, usage: Object }); 当我向数据库中插入某些内容时,该文档可能看起来像: { userId: 10, date: 2015-11-12, usage: { foo: 12, bar: 5 } } 现在是否可以将此文
var TestSchema = new Schema({
_id: String,
userId: Number,
date: Date,
usage: Object
});
当我向数据库中插入某些内容时,该文档可能看起来像:
{
userId: 10,
date: 2015-11-12,
usage: {
foo: 12,
bar: 5
}
}
现在是否可以将此文档向上插入,其中usage使用新文档和旧文档的$sum
因此,当我执行findOneAndUpdate
时,我基本上只想将用法相加。操作符仅适用于通过操作符管道阶段的聚合框架,并且只能返回每个分组字段(而不是多个字段)的总和。您需要的是算术运算符,并且您想要的特定操作不能通过原子更新来完成,您需要两个操作来完成:一个聚合,将旧字段与新对象相加,然后是操作
考虑以下操作,这些操作将最终生成所需的更新:
var newUsageObj = {
"foo": 8,
"bar": 15
},
query = { "userId": 10 };
// Using the mongoose aggregation builder
Model.aggregate()
.match(query)
.project({
"updatedUsage": {
"foo": { "$add": [ "$usage.foo", newUsageObj.foo ]},
"bar": { "$add": [ "$usage.bar", newUsageObj.bar ]}
})
.exec(function (err, res){
if (err) return handleError(err);
res.forEach(function (doc){
Model.findOneAndUpdate(query, { "usage": doc.updatedUsage }, options, callback);
});
});
阅读文档以了解更多信息。很抱歉,对这一问题的响应太晚,但这一点非常有效。我所做的唯一改变是FindUpdate似乎没有创造新的记录。@woutr\u听到这个消息太好了。您是否在
findAndUpdate
方法中指定了选项{upsert:true}
?那个选项插入一个新的记录。以前我没有考虑过的东西,如果我的代码> NeUsAGObj< <代码>不包含<代码> Foo,在<代码>聚合< /代码>中,它将删除该记录。有没有办法解决这个问题?