MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mein $or-Selektor in einem Datenbank-Trigger-Übereinstimmungsausdruck funktioniert nicht auf der zweiten Verschachtelungsebene, wenn ein Datenbank-Trigger konfiguriert wird

Ich konnte dieses Problem umgehen, indem ich die Abfrage so änderte, dass sie nach einem Feld Ausschau hält, das gleichzeitig aktualisiert wird, aber nicht verschachtelt ist. Ich denke, das Problem bei der Suche nach einem verschachtelten Feld ist, dass das ChangeEvent 's updateDescription Eigenschaft enthält nicht das eigentliche verschachtelte Objekt, das sich geändert hat; stattdessen enthält es die Punktnotationsdarstellung der Änderung. Wenn Sie sich also Update 2 ansehen In meinem Beitrag sehen Sie diese updatedFields hat diesen Wert:{\"someOtherField\":310,\"message.fansNo\":1... statt {\"someOtherField\":310,\"message\":{\"fansNo\":1... . Durch die Verwendung von message.fansNo In der $match-Abfrage sucht Mongo nach dieser Objektform:{\"message\":{\"fansNo\":1... , was in diesem Fall nicht passt. Eine "echte" Lösung könnte hier sein, den . zu maskieren in message.fansNo in meinem Match-Ausdruck, aber ich konnte das nicht zum Laufen bringen (siehe dieser Thread ).

Die "Lösung", die für mich funktioniert hat, ist also wirklich nur eine Problemumgehung, die für meinen spezifischen Anwendungsfall funktioniert:Es passiert also, dass someOtherField wird immer zusammen mit message.fansNo aktualisiert und someOtherField ist nicht verschachtelt. So kann ich someOtherField abgleichen ohne sich Gedanken über das Verschachteln zu machen. Im Grunde liefert mir dieser Übereinstimmungsausdruck die gewünschten Ergebnisse:

{
  "$or": [
    {
      "updateDescription.updatedFields.someOtherField": {"$exists":true}
    },
    {
      "updateDescription.updatedFields.someOtherField":{"$exists":true}
    }
  ]
}

Hoffe, das hilft jemand anderem!