Mongodb 查找然后更新

Mongodb find and then update

我想要 运行 一个查询,该查询获取所有具有 'active' 字段的文档和 运行 一个自定义函数来检查 '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?
}
);

谁能告诉我如何在查找查询后更新文档?

根据您要在更新中执行的操作,您可以使用 db.collection.update 并将 multi 标志设置为 true。假设您要将名为 olderThan10Days 的成员设置为 True。您可以像这样使用 update 而不是 find

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

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

否则你可以只遍历你的 result 变量和 updatesave 它单独。

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

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');