2017-05-11 6 views
0

Ich versuche, eine einfache Aufgabenwarteschlange mit Express und Mungo zu bauen. Die Idee ist, einen einzelnen Client zu erwerben und Kampagnen-ID und Client-ID zurückzugeben (was ein Filialdokument der Kampagne ist). Jedes Mal, wenn jemand erwirbt ein Kunde, dessen Statuscode auf 1 gesetzt ist Ich habe mit der folgenden Abfrage kommen:

router.post('/lease', (err, res) => { 
    Campaign.findOneAndUpdate({'isEnabled': true, 'clients.contact_status_code': 0}, { 
      '$set': { 'clients.$.contact_status_code': 1 }, 
     }, 
     { 
      new: true, 
      projection: { 
       'clients.$': true, 
      }, 
     }, 
     (err, campaign) => { 
      if (err) { 
       return res.send(err); 
      } 

      res.json(campaign); 
     } 
    ); 
}); 

Aber alles, was ich bin immer nach diesem Endpunkt verbindet, ist dies:

{"_id":"591483241a84946a79626aef","clients":[{},{}]} 

Es scheint mir, dass das Problem mit der $ Projektion ist, aber ich habe keine Ahnung, wie das zu beheben ist.

EDIT: Ich habe versucht, den folgenden Code verwenden, $ elemMatch Verwendung:

router.post('/lease', (err, res) => { 
    Campaign.findOneAndUpdate({'isEnabled': true, 'clients.contact_status_code': 0}, { 
      '$set': { 'clients.$.contact_status_code': 1 }, 
     }, 
     { 
      new: true, 
      projection: { 
       clients: { 
        '$elemMatch': {contact_status_code: 1}, 
       } 
      }, 
     }, 
     (err, campaign) => { 
      if (err) { 
       return res.send(err); 
      } 

      res.json(campaign); 
     } 
    ); 
}); 

Leider ergibt jede Anforderung die erste Unterdokument in der Sammlung, die die Kriterien abgestimmt - nicht speziell die, die aktualisiert wurde. Hier ein Beispiel:

Sag mal, ich habe folgendes Dokument in Mongo:

{ 
    "_id" : ObjectId("591493d95d48e2738b0d4317"), 
    "name" : "asd", 
    "template" : "{{displayname}}", 
    "isEnabled" : true, 
    "clients" : [ 
      { 
        "displayname" : "test", 
        "_id" : ObjectId("591493d95d48e2738b0d4319"), 
        "contact_status_code" : 0 
      }, 
      { 
        "displayname" : "client", 
        "_id" : ObjectId("591493d95d48e2738b0d4318"), 
        "contact_status_code" : 0 
      } 
    ], 
    "__v" : 0 

}

Ich betreibe die Abfrage zum ersten Mal und erhalten folgendes Ergebnis:

{"_id":"591493d95d48e2738b0d4317","clients":[{"displayname":"test","_id":"591493d95d48e2738b0d4319","contact_status_code":1}]} 

Beachten Sie Client-ID "591493d95d48e2738b0d4319" - dieses Mal wird es wie erwartet ausgeführt. Aber wenn ich die gleiche Abfrage das zweite Mal ausführen, bekomme ich absolut das gleiche Objekt, obwohl ich erwarte, einen mit ID "591493d95d48e2738b0d4318" zu bekommen.

+0

Mögliches Duplikat von [Wie erhalten Sie den neuen Wert nach einem Update in einem eingebetteten Array zurück?] (Http://stackoverflow.com/questions/35946989/how-to-get-back-the-new-value- Nach einem Update-in-einem-Embedded-Array) – Veeram

+0

@Veuram die Antwort schlägt vor, $ elemMatch zu verwenden, um von _id abzufragen. Leider kenne ich das _id vorher nicht: \ – foverzar

+0

Das ist die Antwort für diesen Beitrag. Sie können aktualisieren, um Ihre eigenen Kriterien für den Abgleich zu verwenden. So etwas wie '{ "Projektion": { "Kunden": { "$ elemMatch": { "contact_status_code": 1}} } }' – Veeram

Antwort

0

Das Problem war mit new: true

Hier ist ein funktionierendes Beispiel:

Campaign.findOneAndUpdate({'isEnabled': true, 'clients.contact_status_code': 0}, { 
      '$set': { 'clients.$.contact_status_code': 1 }, 
     }, 
     { 
      //new: true <-- this was causing the trouble 
      projection: { 
       clients: { 
        '$elemMatch': {contact_status_code: 0}, // 0 because the old record gets matched 
       }, 
      }, 
     }, 
     (err, campaign) => { 
      if (err) { 
       return res.send(err); 
      } 

      res.json(campaign); 
     } 
    ); 

Ich gehe davon aus, wenn die new:true gesetzt, Mongo verliert den passenden Kontext. Dieser Ansatz gibt leider den alten Datensatz zurück, aber das dient immer noch meinen Bedürfnissen, um die _id zu bekommen.

+0

Gern geschehen. Ich hoffe, das funktioniert so, wie du es beschreibst. Ich kann keine Dokumentation für dieses Verhalten finden. Stellen Sie sicher, dass Sie alle erforderlichen Testfälle hinzufügen. – Veeram

0

Scheint mir, Sie erhalten die Kampagne ID, aber Sie wollen auch Clients. $, Haben Sie versucht, Clients. $ ._ ID?

+0

Ja, Kampagnen-ID ist in Ordnung - das Problem liegt speziell beim Abrufen des richtigen Filialdokuments. Leider liefert clients. $ ._ id das gleiche Ergebnis: Array von leeren Objekten. – foverzar

Verwandte Themen