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.
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
@Veuram die Antwort schlägt vor, $ elemMatch zu verwenden, um von _id abzufragen. Leider kenne ich das _id vorher nicht: \ – foverzar
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