MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como faço para filtrar dados retornados entre duas datas do mongodb usando uma agregação:correspondência, pesquisa e projeto?


Sua solução parece quase correta, desde que dateStart e dateStart são na verdade Date objetos e não String s.

Sua Experiência 2 estava incompleto Não tenho certeza se usa o $lookup de Experimente 1 ou não. Nesse caso, você deve certificar-se de que a saída de $lookup é o mesmo que a entrada de $filter . Então você deve alterar as em $lookup para corresponder a input de $filter
{
  $lookup: {
    from: "notifications",
    localField: "accessToken",
    foreignField: "accessToken",
    as: "items" // here
  }

}

Solução alternativa

Não tenho certeza do que você quer como saída. Se você precisar apenas de uma matriz de notificações sem o objeto de usuário, tente o seguinte.
[{
  $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' }
}]