MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

So löschen Sie Dokumente, die von einer Aggregationsabfrage in Mongodb zurückgegeben werden

Seit dem Entfernen hat keine Abfragebedingung, die mit allen Dokumenten übereinstimmt und unabhängig vom Aggregationsergebnis gelöscht wird.

Lösung (passen Sie die IDs des aktuellen Cursor-Dokuments an):

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

Eine weitere bessere Lösung wäre ein einzelner Roundtrip zu db, während das Löschen eine Liste von IDs aus der Aggregation erhält cursor() über 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 } });