J'ai une collection nommée 'agendas' chaque agenda a une collection de tâches imbriquées treuil est référencé par l'ID de l'objet. Je fais une recherche sur la collection de tâches et je fais une correspondance basée sur une plage de dates pour trouver tous les "items" de l'agenda avec des tâches entre cette gamme. Je fais ensuite un filtre pour supprimer toutes les tâches. Donc, fondamentalement, les filtres $ match et $ sont les mêmes. Je ne suis pas sûr pourquoi je retourne un élément de l'ordre du jour avec des tâches complètement filtrées []. Je pensais que tout élément de l'ordre du jour serait filtré par le $ match d'abord.
Recherche My:
db.agendas.aggregate([
{ '$lookup': {
from: 'tasks',
localField: 'tasks',
foreignField: '_id',
as: 'tasks' } },
{ '$match': {
'$and': [
{ 'tasks.status': 'Closed' },
{ 'tasks.date': { '$gte': new ISODate('2017-10-01T05:00:00.000Z') } },
{ 'tasks.date': { '$lte': new ISODate('2017-10-01T05:00:00.000Z') } }
] } },
{ '$limit': 100 },
{ '$project': {
type: 1, description: 1,
tasks: {
'$filter': {
input: '$tasks',
as: 'tasks',
cond: { '$and': [
{ '$eq': [ '$$tasks.status', 'Closed' ] },
{ '$gte': [ '$$tasks.date', new ISODate('2017-10-01T05:00:00.000Z') ] },
{ '$lte': [ '$$tasks.date', new ISODate('2017-10-01T05:00:00.000Z') ] }
] } } } } },
{ '$group': { _id: '$type', agenda: { '$push': '$$ROOT' } } },
{ '$sort': { _id: 1 } } ], {}).pretty()
Résultats
{
"_id" : "Maintenance",
"agenda" : [
{
"_id" : ObjectId("59d429ba15c67c147f8f3513"),
"description" : "Some new item 4",
"type" : "Maintenance",
"tasks" : [ ]
}
]
}
{
"_id" : "Monitoring",
"agenda" : [
{
"_id" : ObjectId("59d50d36e6de730a6d85019b"),
"description" : "Some new test agenda for Tomski",
"type" : "Monitoring",
"tasks" : [
{
"_id" : ObjectId("59d5378808f51d0c6590c724"),
"status" : "Closed",
"text" : "Some task 2",
"author" : {
"id" : ObjectId("59c09f8a8b4ad70aa4cda487"),
"name" : "Karunik De"
},
"date" : ISODate("2017-10-01T05:00:00Z"),
"created" : ISODate("2017-10-04T19:33:28.560Z"),
"__v" : 0
}
]
}
]
}