2017-10-10 5 views
0

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 
           } 
         ] 
       } 
     ] 
} 

Répondre

1

Vous devez utiliser $elemMatch lorsque vous avez des critères multiples et que vous souhaitez appliquer tous les critères de chaque tâche.

Quelque chose comme

{ 
    "$match": { 
    "tasks": { 
     "$elemMatch": { 
     "status": "Closed", 
     "date": { 
      "$gte": new ISODate('2017-10-01T05:00:00.000Z'), 
      "$lte": new ISODate('2017-10-01T05:00:00.000Z') 
     } 
     } 
    } 
    } 
} 

Plus here

Comparer avec ci-dessous qui recherche une tâche correspondant à chaque critère. Vous pouvez donc avoir une tâche unique correspondant à tous les critères ou trois tâches différentes correspondant à chacun des critères pour renvoyer le document.

{ 
    "$match": { 
    "tasks.status": "Closed", 
    "tasks.date": { 
     "$gte": new ISODate('2017-10-01T05:00:00.000Z'), 
     "$lte": new ISODate('2017-10-01T05:00:00.000Z') 
    } 
    } 
} 

Plus here