我想运行一个查询,该查询获取所有具有'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?
}
);
有人能告诉我如何在查询后更新文件吗?
答案 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
变量和update
或save
。
答案 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');