Сортировка записей с последующим использованием updateMany в MongoDB с ограничением - PullRequest
0 голосов
/ 22 марта 2019

Я пытаюсь обновить все записи в моей базе данных MongoDB.Я хочу отсортировать записи на основе даты (updatedAt) в порядке возрастания.А затем обновите ограниченное количество записей на основе его текущего состояния (currentStatus).

Вот как выглядят поля: enter image description here

Я пробовал это, ноне работает:

var count = 20;
var sortUpdatedAt = this.collection.find({}).sort({"updatedAt":1});
try {
    this.collection.updateMany(sortUpdatedAt,
     {"currentStatus": {$in:["ACTIVE","IDLE"]} },
     { $set: { "currentStatus" : "SHUTDOWN" } }
    ).limit(count);
} catch (e) {
    logger.error(e);
}

создал переменную sortUpdatedAt, потому что я читал updateMany не поддерживает .sort ()

Ответы [ 2 ]

1 голос
/ 22 марта 2019

К сожалению, find и updateMany не являются подходящими инструментами для этой работы.Вместо этого вы должны заглянуть в конвейер агрегации .С помощью комбинации $sort, $filter и $limit операторов агрегирования вы сможете выполнять точные операции, описанные в вопросе.

PS: Не забудьте добавить индекс в поле, которое вы сортируете (если вы этого еще не сделали), чтобы повысить производительность, если это предполагается обычной операцией для вашей коллекции.

0 голосов
/ 22 марта 2019

Вы можете найти последнее приемлемое обновление и использовать его в качестве параметра в запросе на обновление:

// done inside async context
var count = 20;
var lastAcceptable = await this.collection
  .find({
    currentStatus: { $in: ["ACTIVE", "IDLE"] }
  })
  .sort({ updatedAt: 1 })
  .limit(count);
var lastElement = lastAcceptable.pop();
try {
  this.collection.updateMany(
    {
      currentStatus: { $in: ["ACTIVE", "IDLE"] },
      updatedAt: { $lte: lastElement.updatedAt }
    },
    { $set: { currentStatus: "SHUTDOWN" } }
  );
} catch (e) {
  logger.error(e);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...