2017-03-09 4 views
0

Möchten Sie mit Mongoose Model.findOneAndUpdate() nur ein Dokument finden, wenn jedes Subdoc in Array ein bestimmtes Feld und einen bestimmten Wert hat.Mongoose return doc, wenn jedes Subdoc in Array ein bestimmtes Feld und einen bestimmten Wert hat

In Beispiel 1 unten möchte ich die Suchabfrage so einrahmen, dass jedes Unterdoc im Array den Tag "Montag" und die Anzahl 0 hat. Diese Abfrage würde dem Dokument entsprechen und es für die Aktualisierung verfügbar machen .

Aber die gleiche Abfrage funktioniert nicht für Beispiel 2, da der UnterDokument groupB hat Tag: 'Dienstag', so dass kein Dokument für ein Update zurückgegeben wird.

Example 1 --> 
{ 
    count: 0; 
    groupOffDays: [ 
    { 
     group: A, 
     day: 'Monday' 
    }, 
    { 
     group: B, 
     day: 'Monday' 
    }, 
    { 
    group: C, 
    day: 'Monday' 
    }, 
    ] 
} 

Example 2 --> 
{ 
    count: 0; 
    groupOffDays: [ 
    { 
     group: A, 
     day: 'Monday' 
    }, 
    { 
     group: B, 
     day: 'Tuesday' <--match fails as sub doc does not have a value of Monday 
    }, 
    { 
    group: C, 
    day: 'Monday' 
    }, 
    ] 
} 
+0

Veröffentlichen Sie Ihre Abfrage, die Sie –

+0

gab es einen Versuch in Mongo Shell zuerst versucht haben (bevor es in Mungo versuchen) zu sehen, wie ich das Objekt mit den angewandten Filter finden konnten -> 'Code db.mycoll .find ({groupOffDays: {$ all: [{"$ elemMatch": {tag: "Monday"}}]}}) 'Dies gibt das Objekt zurück, selbst wenn ein Element im Array die Bedingung erfüllt, suchte nach einem Weg Haben Sie nicht das Dokument für Beispiel 2 retrn. –

+0

Sie können es leicht tun, wenn Sie Ihre Struktur zu Schlüsselwertpaar anpassen können. Etwas wie 'groupOffDays: [ {Gruppe: 'A', Tag: 'Montag'} ]' und Sie können Aggregation verwenden. Lass mich wissen was du denkst. – Veeram

Antwort

0

Sie können $redact versuchen, das das gesamte Dokument halten, wenn es den passenden Eintrag aus mit dem angegebenen Filter findet.

$map die wahr, falsch Werte für jeden der groupOffDays als boolean-Array auf dem Filter basiert projizieren und $allElementsTrue die vorherigen Boolesche Werte in Array für jedes Dokument prüfen und ein true zurück, wenn alle Feldwerte wahr sonst falsch sind und $redact wird den Booelan-Wert aus dem obigen Vergleich verwenden; Wahrer Wert zum Behalten und falscher Wert zum Entfernen des Dokuments.

db.mycoll.aggregate([{ 
    $redact: { 
     $cond: [{ 
      $allElementsTrue: { 
       $map: { 
        input: "$groupOffDays", 
        as: "group", 
        in: { 
         $cond: [{ 
           $eq: ["$$group.day", 'Monday'] 
          }, 
          true, 
          false 
         ] 
        } 
       } 
      } 
     }, "$$KEEP", "$$PRUNE"] 
    } 
}]); 
Verwandte Themen