【问题标题】:How to $push , $set and $inc together in mongodb?如何在 mongodb 中同时使用 $push、$set 和 $inc?
【发布时间】:2018-07-22 14:17:39
【问题描述】:

基本上,我是在mongodb中使用loopback,想要推送数据,设置数据和递增数据一起得到最终结果。

为此我尝试了这个。

db.invoice.findOneAndUpdate({ _id: ObjectId(req.params.id) },
        {
            $push: { payment: paymentData }
            , $set: { payment_status: true, updated_at: new Date() }
            , $inc: { total_amount_paid: paidAmt }
        }
        ,
        function (err, doc) {
            if (err) { return new Error(err); }
            else {
                if (doc.result.n>0) {
                    setTimeout(function () { }, 200);
                    console.log(" Invoice updated with Payment info.");
                    nextCall(null, { code: 200, data: doc.result });
                } else {
                    console.log("Something went wrong while payment info updation.")
                    nextCall(null, { code: 400, status: 'Something went wrong while payment info updation.' })
                }
            }
        });
    }); 

案例 1:

文档正在更新,但未推送支付数组。

案例 2:

如果我删除回调函数 它正在推动、设置价值并增加支付的总金额。$inc

如果想实现case2,有人能告诉我哪里做错了吗?

谢谢

【问题讨论】:

  • 在更新对象和回调之间添加选项对象。选项应该有new: true,这将从数据库中返回更新的文档。默认情况下(来自v4.0newfalse,因此您在callback 中的doc 尚未更新文档。

标签: javascript node.js mongodb mongoose mongodb-query


【解决方案1】:

一起执行$push, $inc操作

查找查询:

db.getCollection('noti').find({})

结果:

{
    "_id" : ObjectId("5bc061f05a4c0511a9252e88"),
    "count" : 8.0,
    "color" : "green",
    "icon" : "circle",
    "graph" : [ 
        {
            "date" : ISODate("2018-10-24T08:55:13.331Z"),
            "count" : 2.0
        }, 
        {
            "date" : ISODate("2018-10-24T08:55:13.331Z"),
            "count" : 3.0
        }, 
        {
            "date" : ISODate("2018-10-24T08:55:13.331Z"),
            "count" : 3.0
        }, 
        {
            "date" : ISODate("2018-10-24T08:55:13.331Z"),
            "count" : 6.0
        }, 
        {
            "date" : ISODate("2018-10-24T08:55:13.331Z"),
            "count" : 8.0
        }, 
        {
            "date" : ISODate("2018-10-24T08:55:13.331Z"),
            "count" : 8.0
        }, 
        {
            "date" : ISODate("2018-10-24T08:55:13.331Z"),
            "count" : 9.0
        }
    ],
    "name" : "online visitor",
    "read" : false,
    "date" : ISODate("2018-10-12T08:57:20.853Z"),
    "__v" : 0.0,
    "views" : 1.0
}

更新查询:

db.getCollection('noti').findOneAndUpdate(
   { _id: ObjectId("5bc061f05a4c0511a9252e88") }, 
   { $push: { 
             graph: {
               "date" : ISODate("2018-10-24T08:55:13.331Z"),
               "count" : 10.0
               }  
           },
      $inc: { count: 1 } 
   }, {new: true })

结果:

{
    "_id" : ObjectId("5bc061f05a4c0511a9252e88"),
    "count" : 9.0,
    "color" : "green",
    "icon" : "circle",
    "graph" : [ 
        {
            "date" : ISODate("2018-10-24T08:55:13.331Z"),
            "count" : 2.0
        }, 
        {
            "date" : ISODate("2018-10-24T08:55:13.331Z"),
            "count" : 3.0
        }, 
        {
            "date" : ISODate("2018-10-24T08:55:13.331Z"),
            "count" : 3.0
        }, 
        {
            "date" : ISODate("2018-10-24T08:55:13.331Z"),
            "count" : 6.0
        }, 
        {
            "date" : ISODate("2018-10-24T08:55:13.331Z"),
            "count" : 8.0
        }, 
        {
            "date" : ISODate("2018-10-24T08:55:13.331Z"),
            "count" : 8.0
        }, 
        {
            "date" : ISODate("2018-10-24T08:55:13.331Z"),
            "count" : 9.0
        }, 
        {
            "date" : ISODate("2018-10-24T08:55:13.331Z"),
            "count" : 10.0
        }
    ],
    "name" : "online visitor",
    "read" : false,
    "date" : ISODate("2018-10-12T08:57:20.853Z"),
    "__v" : 0.0,
    "views" : 1.0
}

这里 count 加 1,新的 JSON 对象被插入到图形数组中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多