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

Wie FILTER ich zurückgegebene Daten zwischen zwei Daten von Mongodb mithilfe einer Aggregation:Match, Lookup und Project?

Ihre Lösung sieht fast richtig aus, vorausgesetzt, dass dateStart und dateStart eigentlich Date sind Objekte und nicht String s.

Ihr Versuch 2 war unvollständig. Ich bin mir nicht sicher, ob es den $lookup verwendet von Versuchen Sie 1 oder nicht. In diesem Fall müssen Sie die Ausgabe von $lookup überprüfen ist dasselbe wie die Eingabe von $filter . Sie sollten also as ändern in $lookup passend zu input von $filter

{
  $lookup: {
    from: "notifications",
    localField: "accessToken",
    foreignField: "accessToken",
    as: "items" // here
  }

}

Alternative Lösung

Ich bin mir nicht sicher, was Sie als Ausgabe wollen. Wenn Sie nur ein Array von Benachrichtigungen ohne das Benutzerobjekt benötigen, können Sie Folgendes versuchen.

[{
  $match: { userId: mongoose.Types.ObjectId(userId) }
}, {
  $lookup: {
    from: "notifications",
    localField: "accessToken", // don't forget to index register.accessToken
    foreignField: "accessToken", // don't forget to index notification.accessToken
    as: "notifications"
  }
}, {
  $unwind: "$notifications"
}, {
  $match: { 
    dateCreated: { $gte: dateStart, $lte: dateEnd } // dateStart, dateEnd should be Date objects
  }
}, { // optional, move notifications to top lvel
  $replaceRoot: { root: '$notifications' }
}]