Mongodb找到然后更新

时间:2015-06-29 15:48:36

标签: node.js mongodb mongojs

我想运行一个查询,该查询获取所有具有'active'字段为true的文档,并在其上运行自定义函数,检查文档中的'date'字段是否超过10天。如果它们都为真,那么它将使活动字段为假。

这是我当前代码的样子:

db.ad.find( { $and : [ // Check if active is true and the $where clause also equals to true
    { 'active' : true
    },
    { '$where' : function() { // Custom compare function
            var date = new Moment(this.date); // gets the date from the current document
            var date2 = new Moment();
            return Math.abs(date.diff(date2, 'days')) > 10;
        }
    }
]},
function(err, result) {
    // How to update the document here?
}
);

有人能告诉我如何在查询后更新文件吗?

2 个答案:

答案 0 :(得分:1)

根据您在更新中的操作,您可以使用db.collection.update并将multi标志设置为true。我们假设您要将名为olderThan10Days的成员设置为True。您可以使用update代替find,如下所示:

db.ad.update(
{
   active: True,
   date: {
       $lte: "date10DaysAgo"
   }
}

},
{
   $set : { olderThan10Days : True}
},
{
   multi: True
})

否则,您可以单独遍历result变量和updatesave

答案 1 :(得分:1)

使用 update() 方法和 $set 修饰符运算符更新活动字段。与更新查询对象一样,您可以通过从日期减去10来将日期对象设置为前十天:

var d = new Date();
d.setDate(d.getDate() - 10);
var query = { /* query object to find records that need to be updated */
        "active": true,
        "date": { "$lte": d }
    },
    update = { /* the replacement object */
        "$set": {
            "active": false
        }
    },
    options = { /* update all records that match the query object, default is false (only the first one found is updated) */
        "multi": true
    };

db.ad.update(query, update, options, callback);

- 编辑 -

使用momentjs库,10天前获取日期可以很简单(使用 add() 方法)

d = moment().add(-10, 'days');

或使用 subtract() 方法

d = moment().subtract(10, 'days');