sql >> Database teknologi >  >> NoSQL >> MongoDB

Sådan sletter du dokumenter returneret af en aggregeringsforespørgsel i mongodb

Siden fjern har ikke en forespørgselsbetingelse, den vil matche med alle dokumenter og slette uanset aggregeringsresultatet.

Løsning (matcher id'erne for det aktuelle markørdokument):

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

En anden bedre løsning ville være at have en enkelt tur-retur til db, mens sletning er at få en liste over id'er fra aggregeringen cursor() via 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 } });


  1. Hvornår skal jeg åbne og lukke MongoDB-forbindelser?

  2. Sådan fjerner du et element fra et dobbelt indlejret array i et MongoDB-dokument.

  3. Hvordan forespørger man direkte indlejret felt uden at angive overordnet felt?

  4. Opdatering af et indlejret dokument i mongoengine