2017-08-07 2 views
0

Ich bin auf der Suche nach der MongoDB Leistung zu optimieren, indem Sie die Anzahl der Datensätze zu minimieren.Mongodb Abwickeln und Match VS Match und Unwind

Ich mag:

unwind(injectionRecords), 
match("machineID" : "machine1"), 
count(counter) 

Aber wegen der großen Daten entspannen Betrieb viel Zeit in Anspruch nimmt und dann passt es aus Abwickler. Es wickelt alle 4 Datensätze ab, stimmt dann mit machineID überein und gibt mir die Anzahl davon.

Stattdessen würde Ich mag, wie etwas zu tun ist:

match("machineID": "machine1"), 
unwind(injectionRecords) 
count(counter) 

So wäre es entsprechende Datensätze gefunden MachineID mit und Entspannen nur 2 statt 4 und gib mir die Zählung davon.

Ist das möglich? Wie kann ich das machen?

Hier sind Beispiel docs,

{ 
    "_id" : ObjectId("5981c24b90a7c215e4f166dd"), 
    "machineID" : "machine1", 
    "injectionRecords" : [ 
     { 
      "startTime" : ISODate("2017-08-02T17:45:04.779+05:30"), 
      "endTime" : ISODate("2017-08-02T17:45:07.763+05:30"), 
      "counter" : 1 
     }, 
     { 
      "startTime" : ISODate("2017-08-02T17:45:24.417+05:30"), 
      "endTime" : ISODate("2017-08-02T17:45:27.402+05:30"), 
      "counter" : 2 
     } 
    ] 
}, 
{ 
    "_id" : ObjectId("5981c24b90a7c215e4f166de"), 
    "machineID" : "machine2", 
    "injectionRecords" : [ 
     { 
      "startTime" : ISODate("2017-08-02T17:46:04.779+05:30"), 
      "endTime" : ISODate("2017-08-02T17:46:07.763+05:30"), 
      "counter" : 1 
     }, 
     { 
      "startTime" : ISODate("2017-08-02T17:46:24.417+05:30"), 
      "endTime" : ISODate("2017-08-02T17:46:27.402+05:30"), 
      "counter" : 2 
     } 
    ] 
} 
+1

Es ist sicherlich möglich, eine Aggregationspipeline mit (1) match (2) abzuwickeln, sodass die Antwort auf Ihre Frage davon abhängen kann, ob ** Ihre spezifische Übereinstimmung ** tatsächlich auf die Daten angewendet werden kann, bevor sie abgewickelt wird. Können Sie Ihre Frage aktualisieren, um ein Beispieldokument und Ihre aktuellen Abwicklungs- und Spielphasen hinzuzufügen? – glytching

+0

@glitch kann eine optimierte Abfrage für meine Frage posten? – Pratikmr97

+0

@RicardoRocha Bitte verwende keine Codeformatierung für Wörter wie 'mongodb'. [Für weitere Informationen sieh dir das an] (https://meta.stackoverflow.com/a/254995/4244993) – jmattheis

Antwort

0

Die folgende Abfrage eine Anzahl von injectionRecords für ein gegebenes machineId zurück. I denken das ist, was Sie verlangen.

db.collection.aggregate([ 
    {$match: {machineID: 'machine1'}}, 
    {$unwind: '$injectionRecords'}, 
    {$group:{_id: "$_id",count:{$sum:1}}} 
]) 

Natürlich ist diese Abfrage (wo der Abwickler Platz vor dem Spiel nimmt) ist funktional äquivalent:

db.collection.aggregate([ 
    {$unwind: '$injectionRecords'}, 
    {$match: {machineID: 'machine1'}}, 
    {$group:{_id: "$_id",count:{$sum:1}}} 
]) 

Allerdings läuft diese Abfrage mit erklären ...

db.collection.aggregate([ 
    {$unwind: '$injectionRecords'}, 
    {$match: {machineID: 'machine1'}}, 
    {$group:{_id: "$_id",count:{$sum:1}}} 
], {explain: true}) 

... zeigt, dass die Abwicklungsstufe für die gesamte Sammlung gilt, wenn Sie jedoch vor dem Abwickeln übereinstimmen, werden nur die übereinstimmenden Dokumente abgewickelt.

+0

danke viel @glitch. Ich war mir nicht ganz sicher über die Phasen der Abfrageausführung, aber "{explain: true}" war sehr hilfreich. – Pratikmr97