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,在<代码>聚合< /代码>中,它将删除该记录。有没有办法解决这个问题?