MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment filtrer les données renvoyées entre deux dates de mongodb en utilisant une agrégation :correspondance, recherche et projet ?

Votre solution semble presque correcte, à condition que dateStart et dateStart sont en fait Date objets et non String s.

Votre Essai 2 était incomplet, je ne suis pas sûr qu'il utilise le $lookup à partir de Essayez 1 ou non. Si c'est le cas, vous devez vous assurer que la sortie de $lookup est identique à l'entrée de $filter . Donc, vous devriez changer as dans $lookup pour correspondre à input de $filter

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

}

Solution alternative

Je ne sais pas ce que vous voulez comme sortie. Si vous n'avez besoin que d'un tableau de notifications sans l'objet utilisateur, vous pouvez essayer ce qui suit.

[{
  $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' }
}]