Как удалить документы, возвращенные запросом агрегации в mongodb - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь удалить все документы, возвращенные агрегатом в Mongodb.

У меня есть следующий запрос:

db.getCollection("Collection")
  .aggregate([
    {
      $match: { status: { $in: ["inserted", "done", "duplicated", "error"] } }
    },
    {
      $project: {
        yearMonthDay: { $dateToString: { format: "%Y-%m-%d", date: "$date" } }
      }
    },  
    { $match: { yearMonthDay: { $eq: "2019-08-06" } } }
  ])
  .forEach(function(doc) {
    db.getCollection("Collection").remove({});
  });

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

1 Ответ

0 голосов
/ 06 ноября 2019

Поскольку remove не имеет условия запроса, оно будет соответствовать всем документам и удаляется независимо от результата агрегирования.

Solution (matchидентификаторы текущего документа курсора):

db.getCollection("Collection")
  .aggregate([
    {
      $match: { status: { $in: ["inserted", "done", "duplicated", "error"] } }
    },
    {
      $project: {
        yearMonthDay: { $dateToString: { format: "%Y-%m-%d", date: "$date" } }
      }
    },
    { $match: { yearMonthDay: { $eq: "2019-08-06" } } }
  ])
  .forEach(function(doc) {
    db.getCollection("Collection").remove({ "_id": doc._id });
  });

Другое лучшее решение будет иметь одну поездку туда и обратно в БД, а при удалении получить список идентификаторов из агрегации cursor() через cursor.map()

var idsList = db
  .getCollection("Collection")
  .aggregate([
    {
      $match: { status: { $in: ["inserted", "done", "duplicated", "error"] } }
    },
    {
      $project: {
        yearMonthDay: { $dateToString: { format: "%Y-%m-%d", date: "$date" } }
      }
    },
    { $match: { yearMonthDay: { $eq: "2019-08-06" } } }
  ])
  .map(function(d) {
    return d._id;
  });

//now delete those documents via $in operator
db.getCollection("Collection").remove({ _id: { $in: idsList } });
...