2015-06-29 3 views
0

Я хочу запустить запрос, который получает все документы, у которых есть «активное» поле как истинное, и запускать на них настраиваемую функцию, которая проверяет, находится ли поле «дата» внутри документа старше 10 дней. Если оба они истинны, это сделает активное поле ложным.Mongodb найти, а затем обновить

Это как мой текущий код выглядит следующим образом:

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? 
} 
); 

Может кто-нибудь сказать мне, как обновить документы после запроса находят?

ответ

1

Используйте метод update() с оператором $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); 

- EDIT -

Использование momentjs библиотеки, получая дату 10 дней назад, может быть столь же просто, как (с помощью метода add())

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

или с помощью subtract() метод

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

Сладкий, работает как очарование! Btw +1 за то, что не использовал статью $ where – shash7

+0

@ shash7 Спасибо, рад помочь! – chridam

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 это индивидуально.

Смежные вопросы